ASAP 軟件是一款在 3D 空間通過非序列光線追跡來模擬光學(xué)系統(tǒng)表現(xiàn)度的軟件。多年以來


自從我開始在 Wolfram 工作,我?guī)缀跻恢痹谑褂?Mathematica,不僅作為計(jì)算軟件,而且作為編寫文檔的程序。我很快就在這兩種功能中熟練使用 Mathematica,但我還沒有真正將它用作Wolfram 語言的編程平臺。
我在高中時(shí)發(fā)現(xiàn)了 Wolfram,我當(dāng)時(shí)——現(xiàn)在仍然如此!——對 Wolfram|Alpha 的自然語言能力和知識庫著迷。這種興趣一直持續(xù)到大學(xué),在大學(xué)我接受了 Python 和 Java 的經(jīng)典培訓(xùn),但繼續(xù)將 Wolfram|Alpha 用于數(shù)學(xué)和化學(xué)。我的本科研究要求我學(xué)習(xí) bash 腳本和 Tcl,期間我繼續(xù)使用 Python。
在我攻讀博士學(xué)位的第一學(xué)期,我在研究生院的高級量子力學(xué)課程中接觸了 Mathematica。我的博士研究小組的研究科學(xué)家是一個(gè)強(qiáng)大的 Mathematica 用戶,建議我用他的 Mathematica 筆記本仔細(xì)檢查最初使用 Python 分析的結(jié)果。盡管我在攻讀博士學(xué)位期間多次接觸 Mathematica,但我從未想過 Wolfram 語言可以與 Python 相媲美,直到我開始在 Wolfram 工作時(shí)才意識到它可以用于“實(shí)際”編程。
所以一個(gè)星期六,我坐在我的電腦前,通過重寫我本科計(jì)算機(jī)導(dǎo)論課程的作業(yè)來弄清楚 Wolfram 語言的功能。我可以在 Wolfram 語言中快速鏡像我的本科 Python 代碼,但最終學(xué)到了兩條非常重要的經(jīng)驗(yàn):
Wolfram 語言在利用其優(yōu)勢編寫的代碼而不是鏡像其他語言使用的編程風(fēng)格時(shí)效果最佳。
Wolfram 語言與其他語言相比具有優(yōu)勢,因?yàn)樗鼉?nèi)置了對動(dòng)態(tài)、真實(shí)世界數(shù)據(jù)的訪問。
我的第一個(gè)Python項(xiàng)目
作為一名本科生,我使用 Python 的第一個(gè)項(xiàng)目是編寫蒙特卡羅模擬,該模擬基于一組先前的示例回報(bào)來估計(jì)簡單的投資回報(bào)。
在這個(gè)任務(wù)中,我們必須:
用 Python 編寫蒙特卡羅模擬
將代碼的輸出導(dǎo)入 R
在 R 中分析我們的模擬
寫一篇關(guān)于我們的模擬和結(jié)果的討論
當(dāng)用 Wolfram 語言重做這個(gè)項(xiàng)目時(shí),我決定將 Python 配置為我的 Mathematica 包運(yùn)行。所以我按照這些說明在 Mathematica 中配置 Python。這個(gè)過程讓我可以使用我的代碼并評估它的可比速度。
現(xiàn)在,讓我?guī)瓿蛇@項(xiàng)任務(wù)。第一步是為 2004 年和 2014 年之間的投資回報(bào)率列表分配一個(gè)變量。這個(gè)任務(wù)對兩種編程語言都很簡單,但在 Wolfram 語言中,我們可以直接從 Wolfram 知識庫中提取實(shí)際的投資回報(bào)數(shù)據(jù):

任務(wù)的下一步是創(chuàng)建您自己的函數(shù)來計(jì)算平均值和標(biāo)準(zhǔn)差,并從由該平均值和標(biāo)準(zhǔn)差定義的正態(tài)分布中采樣一個(gè)隨機(jī)值。在用 Wolfram 語言編寫這些自創(chuàng)函數(shù)時(shí),我發(fā)現(xiàn)了四個(gè)最佳實(shí)踐:
與 Python 中的 # 或""相比,Wolfram 語言中的注釋是使用(* *)創(chuàng)建的。您還可以突出顯示一段代碼輸入并使用快捷鍵?Alt?+?/?(或 macOS 上的?Command?+?/?)進(jìn)行注釋。
For 循環(huán)和 While 循環(huán)不是 Wolfram 語言中循環(huán)的最佳方法。相反,使用Table、Map或其他 Wolfram 函數(shù)來加速您的代碼。
不要將您自己創(chuàng)建的 Wolfram 語言函數(shù)的首字母大寫,因?yàn)?Wolfram 定義的函數(shù)都是使用駝峰命名的。此外,切勿在函數(shù)名稱中使用_?,因?yàn)檫@表示 Wolfram 語言中的模式序列。
在 Wolfram 語言中定義多個(gè)函數(shù)時(shí),使用一系列不同的迭代變量(即i?、j?、k?、l等)或使用Module函數(shù)。這樣,如果您調(diào)用多個(gè)自創(chuàng)函數(shù),迭代變量就不會(huì)無意中混淆。
這是我本科時(shí)用 Python 編寫的一些示例代碼:

這是我最近寫的可比較的 Wolfram 語言版本:

任務(wù)的下一步是編寫蒙特卡羅模擬。(完整的代碼示例可在我的示例 Monte Carlo 模擬項(xiàng)目附錄中找到。)當(dāng)我第一次用 Wolfram 語言起草這個(gè)程序時(shí),我基本上逐字重寫了我的 Python 代碼、For 循環(huán)等。因此,當(dāng)我運(yùn)行蒙特卡羅模擬時(shí)(高級 Wolfram 語言用戶會(huì)理解),即使模擬只有 1000 個(gè)點(diǎn),花費(fèi)的時(shí)間也明顯比我預(yù)期的要長。
正是在這一點(diǎn)上,我意識到 Wolfram 語言與其他口語和手語類似,具有多種構(gòu)造句子的方法,并且它需要不同的結(jié)構(gòu)來編程。當(dāng)您有另一種計(jì)算語言的背景時(shí),不要認(rèn)為這種語言與您知道并習(xí)慣使用的另一種編程語言的工作方式相似,這一點(diǎn)很重要。
當(dāng)我重寫 Wolfram 語言代碼使其不是我的迭代 Python 代碼風(fēng)格的逐字副本時(shí),我的蒙特卡羅模擬在速度上與我的原始 Python 代碼示例相當(dāng)。
任務(wù)的最后一步在 Wolfram 語言中很容易:創(chuàng)建直方圖并從我的蒙特卡羅模擬輸出中獲取均值、標(biāo)準(zhǔn)差以及上下 5% 分位數(shù)。(對于我的本科作業(yè),所有這些任務(wù)都是在 R 和 Python 中執(zhí)行的,因?yàn)樵?Python 中創(chuàng)建數(shù)字和執(zhí)行統(tǒng)計(jì)對于入門計(jì)算課程來說太困難和復(fù)雜了。)ta


反思這次經(jīng)歷
在單個(gè)軟件中對每一個(gè) Wolfram 語言函數(shù)進(jìn)行編程并分析數(shù)據(jù)非常方便強(qiáng)大。我還花時(shí)間簡要地重寫了關(guān)于我的結(jié)果的“討論”。教過多門課——并為大量的作業(yè)評分!——作為整個(gè)研究生院的助教,我對老師們在評分和審查學(xué)生作業(yè)時(shí)所做的所有工作更加感激。我記得有很多學(xué)生在這門本科計(jì)算機(jī)科學(xué)課程中忘記提交他們項(xiàng)目的討論部分,因?yàn)樗仟?dú)立于 Python 和 R 代碼的文檔。
Mathematica 在 notebook 界面中集成了代碼和排版,可以幫助防止諸如討論部分未附加到項(xiàng)目代碼中的問題。此外,Mathematica 現(xiàn)在支持的一個(gè)重要功能是 Mathematica Online的集成,它使用 Wolfram Cloud。許多大學(xué)和學(xué)院現(xiàn)在都支持 Mathematica 和 Mathematica Online。這讓您和其他人可以通過 Web 瀏覽器、手機(jī)或平板電腦訪問它,還可以更輕松地共享和發(fā)布文檔。我可以很容易地看到這個(gè)作業(yè)的新版本:
“使用以下命名約定:Comp_Sci_100_StudentLastName_Proj1.”
將您完成的 Mathematica 筆記本(代碼、結(jié)果和討論)分享到*在此處插入教師電子郵件*”
當(dāng)學(xué)生與他們共享筆記本時(shí),教授的 Wolfram Cloud 將發(fā)送通知。教職員工可以將筆記本分類到適當(dāng)?shù)奈募A中,并在準(zhǔn)備為作業(yè)評分時(shí)打開它。
深入了解這些計(jì)算的時(shí)間和速度
我進(jìn)行了多個(gè)測試來比較 Wolfram 語言和 Python 中不同編程風(fēng)格的效果來創(chuàng)建這個(gè)博客,并將計(jì)算分成兩個(gè)表。所有這些計(jì)算都是在 Mathematica 中執(zhí)行的,Python 計(jì)算是在 Mathematica 中使用 Python 的外部會(huì)話執(zhí)行的。
第一列顯示了我所描述的迭代編程風(fēng)格的緩慢時(shí)間。(這種風(fēng)格也稱為過程式編程。)第二列介紹了用戶定義的函數(shù)式編程。這是我使用 Table 或 Map 作為循環(huán)函數(shù)而不是 For 循環(huán)的時(shí)候,并遵循了前面提到的 Wolfram 語言中的四個(gè)最佳實(shí)踐。我僅使用內(nèi)置函數(shù)(而不是自創(chuàng)函數(shù))為實(shí)現(xiàn)此蒙特卡羅模擬進(jìn)行了最后一次速度測試。在我的附錄中,我還包含了兩種額外的 Python 編程風(fēng)格的代碼,這兩種編程風(fēng)格的時(shí)序都與這種內(nèi)置函數(shù)風(fēng)格相似:


(一些注意事項(xiàng):所有計(jì)算均在 Mathematica 中執(zhí)行。三次重復(fù)值的平均值顯示在相應(yīng)表格的每個(gè)框中。Python 計(jì)算是使用 Mathematica 中的外部會(huì)話執(zhí)行的。淺藍(lán)色背景用于表示最快的時(shí)間. 計(jì)時(shí)使用 Wolfram 的 AbsoluteTiming函數(shù)計(jì)算,類似的方法用于 timeit 函數(shù)和 Python 3.9 版。)
如上表所示,迭代式編程是最慢的。比較單一語言中的不同編程風(fēng)格,Wolfram 語言在速度上有更大的差異。盡管這種時(shí)間差異在 Python 語言中很明顯,但并沒有那么顯著。對于新程序員來說,用 Wolfram 語言編程時(shí)這種最初的緩慢速度可能是一種威懾。然而,正如所有程序員都學(xué)會(huì)以更高效和有效的方式編寫代碼一樣,與編程風(fēng)格相關(guān)的速度的顯著提高在 Wolfram 語言中更為明顯。從這些表中,很明顯 Wolfram 語言在速度上可與 Python 等其他解釋型語言相媲美。
對于我們這些接受過 Python 和其他計(jì)算語言經(jīng)典訓(xùn)練的人來說,如果我們嘗試像其他語言一樣構(gòu)建代碼,Wolfram 語言可能看起來很慢。然而,如果我們退后一步重新考慮我們的代碼和我們正在使用的函數(shù),Wolfram語言具有相當(dāng)?shù)乃俣群涂晒┨剿鞯拇罅抗δ?。這些功能還可以使靜態(tài)作業(yè)本質(zhì)上是動(dòng)態(tài)的,讓學(xué)生能夠使用真實(shí)世界的數(shù)字和數(shù)據(jù)探索概念。學(xué)習(xí) Wolfram 語言就像學(xué)習(xí)任何外語一樣:必須始終考慮語法和措辭。
購買軟件/免費(fèi)試用
【13.2.1中英文 Wolfram 軟件】請點(diǎn)擊評論區(qū)留言或私聊申請