تقریبا در تمام زبانهای برنامهنویسی از نسل سی، چیزی به اسم آرایه وجود دارد.در زبان سی یک آرایه را میتوان یک فهرست از متغیرهای همنوع در نظر گرفت که خانههای مجاور حافظه به آن تخصیص داده شده هست. به عنوان یک نمونه، در زبان سی یک آرایه از ۳ عدد صحیح تعریف کردهام:
int my_cool_array[3] = {1, 2, 3};
در پایتون چیزی به اسم آرایه نداریم. خود زبان به صورت ذاتی(منظورم builtin یا توکار هست) چند نوع مخزن دارد که اینجا من در مورد دو مورد از آنها برایتان مینویسم.
بر خلاف آرایهها در سی که تنها میتوانند دادههایی از یک نوع را در خود نگه دارند، لیست، توپل(تاپل)، دیکشنری(جدول هش) و مجموعه در پایتون هر کدام میتوانند همزمان دادههایی با نوعهایی مختلف را درون خود داشته باشند.
بنده دیروز در اتاق ماتریکس هشبنگ یک پرسش مطرح کردم: «عقیده شما در مورد پایتون چیست؟» یکی گفت زبان «چندشآور» و «احمقانهای» است اما دیگری جواب بهتری داد:
آسان برای یادگیری، عالی برای درست کردن پیشنمونه یا prototype و یادگیری تئوری مهندسی کامپیوتر، عالی برای اسکریپتهایی که میخواهی قابل پیشبینی باشند. [اما] افتضاح برای سرعت یا مقیاسپذیری.
Lance R. Vick
بله! پایتون واقعا برای یادگیری آسان است و میتوانید با آن سریع و طی مثلا چند ساعت(یا بیشتر یا کمتر که البته به اندازه و نوع پروژه بستگی دارد) یک پیشنمونه بسازید. علاوه بر اینها شما را با چیزی مثل مدیریت دستی حافظه درگیر نمیکند. در نتیجه کاندیدای خوبی برای یادگیری مهندسی کامپیوتر و شروع برنامهنویسی هست. اما خب همه خوبیها در این زبان برنامهنویسی جمع نشدهاند. پایتون با پیادهسازی پیشفرضش،که تقریبا همهجا استفاده میشود، «کند» است(میتوانید مطلب پیادهسازی الگوریتم وارشال در پایتون و راست را ببینید)
لنس ادامه داد:
اگر نیاز داری چیزی را یک بار در ثانیه روی یک پردازنده تک هستهای اجرا کنی، پایتون برای هک کردن(در اینجا نه به معنی نفوذ و خرابکاری –فاروق) چیزی که کار را انجام دهد، آسان خواهد بود. اگر به سرعت و امنیت نیاز داری، بهتر است به سراغ راست(Rust) یا گو(Go) بروی. اما آن دو سرمایهگذاری اولیه بیشتری را برای برنامهنویسی طلب میکنند. من ترجیح میدهم برای چیزی که تنها یکبار قرار است انجام شود و سرعت مهم نیست به سراغ پایتون بروم تا طی مدت زمان کوتاهی، مثلا چند ساعت آینده، شروع به کار کند. اما اگر مقیاسپذیری میخواهم یا قرار است با بارهای سنگین شبکه دست و پنجه نرم کنم و غیره، در آن صورت به سراغ گو میروم.
Lance R. Vick
لنس در اینجا به ضعف امنیتی پایتون در برنامههای چند ریسمانی(multi thread) اشاره میکند(به نظر من). البته خود در مورد آن چیزی نمیدانم و لیکن در موردش شنیدهام. سپس میگوید به سرمایهگذاری اولیه بیشتری نیاز داریم تا گو یا راست یا یاد بگیریم که جز این نیست مخصوصا که راست(و احتمالا گو) مقداری تفکر جدید میطلبد. و این تفکر جدید باید ساخته شود که زمان و انرژی میبرد.
نهایتا به عنوان یک خلاصه، اگر برای استفاده کوتاه مدت زبانی نیاز دارید یا برای شروع برنامهنویسی، پایتون گزینه بسیار خوبیست اما برای یک کار طولانی مدت بهتر است به سراغ گو یا راست بروید.
برای شخص بنده با خواندن کد پایتون خیلی راحتتر میتونم الگوریتم را بفهمم.اینجا به ترتیب کد راست و پایتون الگوریتم وارشال برای بدست آوردن بستار متعدی یک ماتریس باینری رابطه قرار داده شده. همچنین پیوند کد در گیتهاب گیست نیز زیر تکه کد را اضافه کردهام. علاوه بر اینها زمان اجرا شدن این کدها برای راست و پایتون در گیست مورد نظر به صورت کامنت نوشته شده است.توجه کنید که در هر دو زبان با حلقه for این پیادهسازی انجام گشته و در صورتی که با استفاده از map همین الگوریتم را پیاده کنید پرفرمنس احتمالا بهبود خواهد یافت.
هشدار! کد راست با اینکه به درستی کار میکند اما ممکن است به روش خود راست نوشته نشده باشد و در آن عادتهای خوب برنامهنویسی رعایت نشده باشد!
// Code by Rust beginner, Farooq Karimi Zadeh
// Under CC0 1.0
// Warning! Code might not be idiomatic
fn main() {
let mut bin_matrix = [
[0, 1, 0, 0],
[1, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 0]
];
const N:u32 = 300_000;
for _dummy in 0..N {
for k in 0..bin_matrix.len() {
let the_clone = bin_matrix;
for (i, row) in bin_matrix.iter_mut().enumerate() {
for (j, value) in row.iter_mut().enumerate() {
if *value == 0 {
*value = the_clone[i][k] & the_clone[k][j];
}
}
}
}
}
println!("{:?}", bin_matrix);
}
پیوند کد راست در گیتهاب گیست(به همراه زمان اجرا روی لپتاپ بنده)
"""
Warshall algorithm
This calculates transitive closure for a given binary matrix
Author: Farooq Karimi Zadeh
Code is under CC0 1.0
"""
from pprint import pprint
def pretty_print_matrix(matrix):
pprint(matrix, width=len(matrix[0]) * 3 + 2)
n = int(3e5) # calculate n times
bin_matrix = [[0, 1, 0, 0], [1, 0, 1, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
for dummy in range(n):
for k, _ in enumerate(bin_matrix):
for i, row in enumerate(bin_matrix):
for j, value in enumerate(row):
if not value:
bin_matrix[i][j] = bin_matrix[i][k] and bin_matrix[k][j]
if n == 1:
pretty_print_matrix(bin_matrix)
else:
pass # then we are benchmarking
پیوند کد پایتون در گیتهاب گیست(به همراه زمان اجرا روی لپتاپ بنده)
گیت چیست؟
گیت یا git یک برنامه آزاد و متنباز برای مدیریت پروژههای برنامهنویسی هست که بسیار سریع و موثر می تواند به برنامهنویسان برای مدیریت پروژههای کوچک تا بزرگ کمک کند. یادگیری و استفاده از گیت بسیار ساده است و امکانات بسیار قابل توجهی در اختیار برنامهنویسان قرار میدهد.
از تواناییهای این نرم افزار میتوان به نمونههای زیر اشاره کرد:
- به شما امکان مدیریت پروژههای چند نفره را میدهد
- به سادگی می توان تغییرات را ثبت، دنبال، و بازگردانی کرد
- می تواند به یک سرور وصل شود تا علاوه بر داشتن یک بکاپ از کل پروژه آن را با دیگران به اشتراک بگذارید
- امکان استفاده از چند شاخه، ادغام و مدیریت شاخهها
- و …
استان از جایی شروع شد که در مقاله چطور کاری کنیم لیسپ سریعتر از سی اجرا شود؟ خواندم که کامن لیسپ بنا به خواست برنامهنویس میتواند «زبانی با تعیین نوع پویا(dynamic) ویا ایستا(static) باشد» که کنجکاوی بنده برانگیخته شد(بخوانید فضولیام گل کرد!) و در کانال #clschool
روی شبکهی آیآرسی فرینود پرسیدم که در ادامه نتیجه بحث خدمتتون عرض خواهد شد. توجه کنید که ممکن است جدیدا این کانال مانند بسیاری از دیگر کانالها به شبکه لیبراچت منتقل شده باشد.