@@ -24,7 +24,7 @@ translation:
2424 JAX as a NumPy Replacement::Differences::A Workaround : راهحل جایگزین
2525 Functional Programming : برنامهنویسی تابعی
2626 Functional Programming::Pure functions : توابع خالص
27- Functional Programming::Examples : مثالها
27+ Functional Programming::Examples -- Pure and Impure : مثالها -- خالص و ناخالص
2828 Functional Programming::Why Functional Programming? : چرا برنامهنویسی تابعی؟
2929 Random numbers : اعداد تصادفی
3030 Random numbers::NumPy / MATLAB Approach : رویکرد NumPy / MATLAB
356356* وضعیت سراسری را تغییر نمیدهد
357357* دادههای ارسال شده به تابع را تغییر نمیدهد (دادههای تغییرناپذیر)
358358
359- ### مثالها
359+ ### مثالها -- خالص و ناخالص
360360
361- در اینجا مثالی از یک تابع * غیرخالص * آورده شده است
361+ در اینجا مثالی از یک تابع * ناخالص * آورده شده است
362362
363363``` {code-cell} ipython3
364364tax_rate = 0.1
365- prices = [10.0, 20.0]
366365
367366def add_tax(prices):
368367 for i, price in enumerate(prices):
369368 prices[i] = price * (1 + tax_rate)
370- print('Post-tax prices: ', prices)
371- return prices
369+
370+ prices = [10.0, 20.0]
371+ add_tax(prices)
372+ prices
372373```
373374
374375این تابع نمیتواند خالص باشد زیرا
@@ -379,15 +380,21 @@ def add_tax(prices):
379380در اینجا یک نسخه * خالص* آورده شده است
380381
381382``` {code-cell} ipython3
382- tax_rate = 0.1
383- prices = (10.0, 20.0)
384383
385384def add_tax_pure(prices, tax_rate):
386385 new_prices = [price * (1 + tax_rate) for price in prices]
387386 return new_prices
387+
388+ tax_rate = 0.1
389+ prices = (10.0, 20.0)
390+ after_tax_prices = add_tax_pure(prices, tax_rate)
391+ after_tax_prices
388392```
389393
390- این نسخه خالص تمام وابستگیها را از طریق آرگومانهای تابع صریح میکند و هیچ وضعیت خارجی را تغییر نمیدهد.
394+ این نسخه خالص است زیرا
395+
396+ * تمام وابستگیها از طریق آرگومانهای تابع صریح هستند
397+ * و هیچ وضعیت خارجی را تغییر نمیدهد
391398
392399### چرا برنامهنویسی تابعی؟
393400
@@ -437,7 +444,7 @@ print(np.random.randn(2))
437444* غیرقطعی است: ورودیهای یکسان، خروجیهای متفاوت
438445* دارای عوارض جانبی است: وضعیت مولد اعداد تصادفی سراسری را تغییر میدهد
439446
440- در موازیسازی خطرناک است --- باید با دقت کنترل کرد که در هر رشته چه اتفاقی میافتد!
447+ این در موازیسازی خطرناک است --- باید با دقت کنترل کرد که در هر رشته چه اتفاقی میافتد.
441448
442449### JAX
443450
@@ -554,7 +561,11 @@ plt.show()
554561تابع زیر ` k ` ماتریس تصادفی ` n x n ` (شبه) مستقل را با استفاده از ` split ` تولید میکند.
555562
556563``` {code-cell} ipython3
557- def gen_random_matrices(key, n=2, k=3):
564+ def gen_random_matrices(
565+ key, # JAX key for random numbers
566+ n=2, # Matrices will be n x n
567+ k=3 # Number of matrices to generate
568+ ):
558569 matrices = []
559570 for _ in range(k):
560571 key, subkey = jax.random.split(key)
@@ -576,7 +587,7 @@ gen_random_matrices(key)
576587
577588### مزایا
578589
579- صریح بودن JAX مزایای قابل توجهی به همراه دارد :
590+ همانطور که در بالا ذکر شد، این صراحت ارزشمند است :
580591
581592* تکرارپذیری: با استفاده مجدد از کلیدها، تکرار نتایج آسان است
582593* موازیسازی: کنترل آنچه در رشتههای جداگانه اتفاق میافتد
@@ -657,7 +668,14 @@ with qe.Timer():
657668
658669نتیجه مشابه مثال ` cos ` است --- JAX سریعتر است، به ویژه در اجرای دوم پس از کامپایل JIT.
659670
660- اما همچنان از اجرای eager استفاده میکنیم --- حافظه و خواندن/نوشتن زیاد.
671+ این به این دلیل است که عملیاتهای آرایهای منفرد روی GPU موازیسازی میشوند.
672+
673+ اما همچنان از اجرای eager استفاده میکنیم
674+
675+ * حافظه زیاد به دلیل آرایههای میانی
676+ * خواندن/نوشتن حافظه زیاد
677+
678+ همچنین، هستههای جداگانه زیادی روی GPU راهاندازی میشوند.
661679
662680### کامپایل کل تابع
663681
@@ -691,7 +709,8 @@ with qe.Timer():
691709
692710* بهینهسازی تهاجمی بر اساس کل دنباله محاسباتی
693711* حذف چندین فراخوانی به شتابدهنده سختافزاری
694- * عدم ایجاد آرایههای میانی
712+
713+ ردپای حافظه نیز بسیار کمتر است --- عدم ایجاد آرایههای میانی.
695714
696715اتفاقاً، نحو رایجتر هنگام هدف قرار دادن یک تابع برای کامپایلر JIT این است
697716
0 commit comments