搜尋
首頁後端開發Python教學一次彩票探索如何讓我了解 PyTorch 的強大功能

介紹

在某個時間點,您可能聽說過中獎彩票的機會非常渺茫。就像所有與機率相關的事情一樣,多次試驗可能會導致結果對你有利。現在,如果你參加很多次彩票,你中獎的機會會更大一些,這取決於你參加了多少次彩票。這仍然不能保證你最終會中獎,但是是均勻分佈的,並根據大數定律(在本例中意味著大量彩票),我們可以得出相對更有可能的可能性。

重要的是要了解,每個新彩票都是獨立於其他彩票的,並且相同的彩票“彩票號碼”可以贏得許多不同的彩票(遵循大數定律)。您也可能會運氣不好,無論您嘗試了多少次,每次都選錯了號碼。您現在有兩個選擇:

  1. 您每次都可以嘗試隨機數字。
  2. 您每次都可以嘗試相同號碼。

理論上(和數學上),這兩種情況發生的可能性相同。然而,場景 2 會帶給你輕微的優勢。隨著次數接近無窮大,最終每一個數字都會被選中。問題是,對於場景 1,您需要嘗試更多次,希望您當時選擇的數字與獲勝的數字相符。在情境 2 中,您確信隨著試驗趨於無限,您的數字將在某個時刻「獲勝」。對於本博文,我們將使用場景 2。

那麼,在我告訴你答案之前,你認為你能回答這個問題嗎?

「如果您周圍的所有彩票都有正好100 萬人的老虎機,並且您為每個玩過的人都選擇了同一張彩票[x],那麼您需要玩多少張彩票才能最終成為中獎者?

答案是...


How a Lottery Quest Led Me to The Powers of PyTorch

1440萬次

這篇文章的其餘部分將介紹我如何得出該值、如何進行模擬以及一些注意事項。從這裡開始事情會變得更加技術化。


How a Lottery Quest Led Me to The Powers of PyTorch

邏輯

100萬人的彩券號碼範圍為1 - 1,000,000(或0 - 999,999)。玩家每次抽獎只能選擇該範圍內的號碼,中獎彩券也只能來自該範圍。本質上,我們可以說我們將擁有一組 100 萬個數字。

考慮到使用者可以選擇該範圍內的任何數字,我們需要滿足集合中的每個項目至少被擊中一次的條件。這是因為,如果每個號碼至少被叫過一次,那麼它將涵蓋玩家可能選擇的任何可能的票號。這也意味著我們不關心每個數字運行了多少次,從而使「集合」成為用於我們的模擬的理想 Python 資料結構。我們將從一個空集合開始,並在每次迭代時用隨機生成的數字填充它,直到該集包含指定範圍內的每個數字。由於 Python 集合不重複數字,因此我們不必擔心確保唯一性。

def calculate_lottery_chances(lottery_players_count):
  number_set = set()
  count = 0

  while len(number_set) 



<p>對於 1,000,000 人的彩票,函數調用如下:calculate_lottery_chances(1000000),它將返回中獎之前嘗試彩票的次數。以這種方式排列程式碼使其具有很強的可擴展性。 </p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637690021.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p>

<h2>
  
  
  問題
</h2>

<p>簡單來說,問題的根源就是「變異」。第一次運行該函數時,我得到了“1310 萬”次作為我的值。我重新運行了一下,得到了大約 1390 萬的結果。我這樣做了更多次,得到的答案差異很大——在某個時候,我得到了 1500 萬個。很明顯,我需要這樣做並找到平均值。按照目前現有的模式,我認為隨著平均迭代次數趨於無窮大,我將更接近得到<strong>一個</strong>可靠的答案。需要一些可以做到這一點並且快速完成的東西,這促使我編寫了這個函數:<br>
</p>

<pre class="brush:php;toolbar:false">def average_over_n_times(function, function_arg, n):
  """
  This returns the average of the returned value of a function
  when it is called n times, with its (one) arg
  """
  total = 0
  for x in range(0, n):
    total += function(function_arg)

  return round(total/n)

隨後,所有內容都會被修補為:

num_of_trials = average_over_n_times(calculate_lottery_chances, lottery_players_count, n)

其中「n」表示結果平均的次數。然而,這帶來了另一個問題,我們將在下一節中討論。

「n」應該是什麼?

n 的值越大,結果越接近「平均情況」。然而,考慮到仍然沒有絕對性或確定性,執行這一系列任務太多次就會失去生產力。我這麼說有以下原因:

  • 時間不是無限的,我們不能無限期地執行這些計算,這意味著每次運行時總會有變化(無論多小),這違背了「絕對」的想法。
  • 計算資源是有限的。
  • 這個實驗的假設之一是電腦產生的「隨機性」可以準確地模擬現實。
  • 就像演算法運行時一樣,較小的幅度不再與較大的幅度一樣重要。當處理大於 13,000,000 的值時,大約 100,000 的變化就不會那麼顯著。

牢記這些,我用以下值測試了「n」:10、20、30、50、100、1000 和 5000 次。

PyTorch 從何而來?

此時,您可能想知道為什麼部落格標題中沒有提到「PyTorch」一詞。好吧,雖然我提到用不同的值測試 n,但它與我用於所有測試的程式碼並不相同。

這些都是計算量很大的實驗,我的 CPU 跟我說了一句話。我之前分享的程式碼片段是在一個具有零外部包依賴性的文件中編寫的,並且該文件在 bash shell 中運行,並在前面添加了 time 命令來追蹤執行時間。以下是僅使用 CPU 時的執行時間:

n Time (min and sec)
10 1m34.494s
20 3m2.591s
30 5m19.903s
50 10m58.844s
100 14m56.157s

在 1000 時,我無法再讓程式運作了。我不確定是不是中途斷了沒能停止執行,但我在4小時57分鐘後取消了。我認為有幾個因素影響了這一點,我將在「注意事項」部分中討論這些因素。不管怎樣,我的風扇噪音很刺耳,我知道我可能已經把筆記型電腦功率適中的 CPU 推得有點太多了。我拒絕接受失敗,在思考如何至少運行 4 位元迭代時,我想起了一位使用 PyTorch 的朋友告訴我的話:

「GPU 在運算密集方面通常比 CPU 更有效率」

PyTorch 使用 GPU,使其成為完成這項工作的完美工具。

重構

PyTorch 將用於我們目的的計算,因此重構現有的calculate_lottery_chances() 程式碼意味著更改依賴CPU 的數值運算並切換到適當的PyTorch 資料結構。簡而言之:

  • Python set() 資料型別將不再足夠。
  • Python randint() 函數將替換為其 PyTorch 等效函數。
  • 由於 set() 資料類型不夠,因此會切換為產生與 lottery_players_count 大小相符的零張量,並用布林值來指示某個號碼之前是否中獎。

calculate_lottery_chances 的重構如下:

def calculate_lottery_chances(lottery_players_count):
  number_set = set()
  count = 0

  while len(number_set) 



<p>我將裝置設定為“xpu”,因為我的電腦使用 PyTorch 支援的 Intel Graphics GPU。 </p>

<h2>
  
  
  輸出
</h2>

<p>為了確保在執行過程中使用我的 GPU,我在運行之前打開了 Windows 工作管理員並導航到「效能」部分。運行時,我發現 GPU 資源使用量有明顯峰值。 <br>
對於上下文,這是之前和之後的對比:</p>

<p>之前:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637915280.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br>
請注意 GPU 使用率為 1%</p>

<p>之後:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638051975.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br>
請注意,GPU 使用率為 49%</p>

<p>對於不同 n 值的運行時間,GPU 的速度要快幾倍。它在不到一分鐘的時間內始終運行低於 100 的 n 值,並且能夠計算 <strong>5000</strong>(五千!)</p> 的 n 值

<p>這是使用 GPU 的執行時間表:</p>

<div><table>
<thead>
<tr>
<th>n</th>
<th>Time (min and sec)</th>
</tr>
</thead>
<tbody>
<tr>
<td>10</td>
<td>0m13.920s</td>
</tr>
<tr>
<td>20</td>
<td>0m18.797s</td>
</tr>
<tr>
<td>30</td>
<td>0m24.749s</td>
</tr>
<tr>
<td>50</td>
<td>0m34.076s</td>
</tr>
<tr>
<td>100</td>
<td>1m12.726s</td>
</tr>
<tr>
<td>1000</td>
<td>16m9.831s</td>
</tr>
</tbody>
</table></div>

<p>為了直觀地了解本實驗中 GPU 和 CPU 操作之間的效能差距有多大,可以考慮以下資料視覺化:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638195144.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p>

<p>x 軸的上限為 100,因為我無法再從 CPU 獲得實際的「及時」輸出,因此沒有空間與 GPU 進行比較。使用 1000 - 5000 範圍內的數字進行實驗,結果往往是「1440 萬次」。這就是我之前得到答案的方式。 </p>

<h2>
  
  
  注意事項
</h2>

<p>這個實驗做出了假設並依賴某些做事方式。此外,我對 PyTorch 的經驗不足可能意味著可能有更有效的方法。以下是一些需要考慮的因素<strong>可能</strong>影響了我的發現的準確性或執行時間:</p>

<ol>
<li>我做了一個微妙的假設,即電腦生成的隨機性模仿了現實生活(物理世界)中的隨機性。 </li>
<li>雖然我切換了一些邏輯以使用 PyTorch,但其餘程式碼仍然依賴 CPU。例如,在 Average_over_n_times() 函數中,迴圈中的加法和求平均值可能都會受益於 PyTorch 的等效項。我懷疑性能會有所提升。 </li>
<li>我不確定我使用的batch_size對準確性和效能的影響。 </li>
<li>所有 CPU 和 GPU 測試都是在我的電腦接通電源的情況下完成的,以便讓機器發揮最佳狀態。使用電池供電的設備運行它們可能會獲得更長的運行時間。 </li>
<li>PyTorch 的 CUDA 可能比「XPU」更有優勢,但我的電腦不支援前者。 </li>
<li>測試期間我避免讓我的電腦「休眠」。如果您的電腦處於睡眠狀態,測試可能需要更長時間才能運作。 </li>
</ol>

<p>最後,我想指出,這是我第一次使用 PyTorch 做任何事,它的性能給我留下了深刻的印象。 </p>

<h2>
  
  
  結論
</h2>

<p>當我陷入困境時,我沒想到會看到效能上的如此提升。我了解了張量背後的想法以及一些有關計算更複雜的任務背後的支援機制的知識。您可以隨意使用、複製或修改程式碼片段。 </p>

<p>感謝您對我的包容,希望您閱讀愉快。 </p>

<p>下次再見,</p>

<p>乾杯。 ? </p>


          

            
        

以上是一次彩票探索如何讓我了解 PyTorch 的強大功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python的執行模型:編譯,解釋還是兩者?Python的執行模型:編譯,解釋還是兩者?May 10, 2025 am 12:04 AM

pythonisbothCompileDIntered。

Python是按線執行的嗎?Python是按線執行的嗎?May 10, 2025 am 12:03 AM

Python不是嚴格的逐行執行,而是基於解釋器的機制進行優化和條件執行。解釋器將代碼轉換為字節碼,由PVM執行,可能會預編譯常量表達式或優化循環。理解這些機制有助於優化代碼和提高效率。

python中兩個列表的串聯替代方案是什麼?python中兩個列表的串聯替代方案是什麼?May 09, 2025 am 12:16 AM

可以使用多種方法在Python中連接兩個列表:1.使用 操作符,簡單但在大列表中效率低;2.使用extend方法,效率高但會修改原列表;3.使用 =操作符,兼具效率和可讀性;4.使用itertools.chain函數,內存效率高但需額外導入;5.使用列表解析,優雅但可能過於復雜。選擇方法應根據代碼上下文和需求。

Python:合併兩個列表的有效方法Python:合併兩個列表的有效方法May 09, 2025 am 12:15 AM

有多種方法可以合併Python列表:1.使用 操作符,簡單但對大列表不內存高效;2.使用extend方法,內存高效但會修改原列表;3.使用itertools.chain,適用於大數據集;4.使用*操作符,一行代碼合併小到中型列表;5.使用numpy.concatenate,適用於大數據集和性能要求高的場景;6.使用append方法,適用於小列表但效率低。選擇方法時需考慮列表大小和應用場景。

編譯的與解釋的語言:優點和缺點編譯的與解釋的語言:優點和缺點May 09, 2025 am 12:06 AM

CompiledLanguagesOffersPeedAndSecurity,而interneterpretledlanguages provideeaseafuseanDoctability.1)commiledlanguageslikec arefasterandSecureButhOnderDevevelmendeclementCyclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesandentency.2)cransportedeplatectentysenty

Python:對於循環,最完整的指南Python:對於循環,最完整的指南May 09, 2025 am 12:05 AM

Python中,for循環用於遍歷可迭代對象,while循環用於條件滿足時重複執行操作。 1)for循環示例:遍歷列表並打印元素。 2)while循環示例:猜數字遊戲,直到猜對為止。掌握循環原理和優化技巧可提高代碼效率和可靠性。

python concatenate列表到一個字符串中python concatenate列表到一個字符串中May 09, 2025 am 12:02 AM

要將列表連接成字符串,Python中使用join()方法是最佳選擇。 1)使用join()方法將列表元素連接成字符串,如''.join(my_list)。 2)對於包含數字的列表,先用map(str,numbers)轉換為字符串再連接。 3)可以使用生成器表達式進行複雜格式化,如','.join(f'({fruit})'forfruitinfruits)。 4)處理混合數據類型時,使用map(str,mixed_list)確保所有元素可轉換為字符串。 5)對於大型列表,使用''.join(large_li

Python的混合方法:編譯和解釋合併Python的混合方法:編譯和解釋合併May 08, 2025 am 12:16 AM

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增強效率和通用性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版