」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 效能追求第二部分:Perl 與 Python

效能追求第二部分:Perl 與 Python

發佈於2024-08-01
瀏覽:448

The Quest for Performance Part II : Perl vs Python


運行了一個玩具性能示例後,我們現在將稍微偏離主題並將性能與
進行對比 一些 Python 實作。首先讓我們設定計算階段,並提供命令列
Python 腳本的功能。

import argparse
import time
import math
import numpy as np
import os
from numba import njit
from joblib import Parallel, delayed

parser = argparse.ArgumentParser()
parser.add_argument("--workers", type=int, default=8)
parser.add_argument("--arraysize", type=int, default=100_000_000)
args = parser.parse_args()
# Set the number of threads to 1 for different libraries
print("=" * 80)
print(
    f"\nStarting the benchmark for {args.arraysize} elements "
    f"using {args.workers} threads/workers\n"
)

# Generate the data structures for the benchmark
array0 = [np.random.rand() for _ in range(args.arraysize)]
array1 = array0.copy()
array2 = array0.copy()
array_in_np = np.array(array1)
array_in_np_copy = array_in_np.copy()

這是我們的參賽者:

  • 基礎Python
  for i in range(len(array0)):
    array0[i] = math.cos(math.sin(math.sqrt(array0[i])))
  • Numpy(單線程)
np.sqrt(array_in_np, out=array_in_np)
np.sin(array_in_np, out=array_in_np)
np.cos(array_in_np, out=array_in_np)
  • Joblib(請注意,這個範例不是真正的就地範例,但我無法使用 out 參數使其運行)
def compute_inplace_with_joblib(chunk):
    return np.cos(np.sin(np.sqrt(chunk))) #parallel function for joblib

chunks = np.array_split(array1, args.workers)  # Split the array into chunks
numresults = Parallel(n_jobs=args.workers)(
        delayed(compute_inplace_with_joblib)(chunk) for chunk in chunks
    )# Process each chunk in a separate thread
array1 = np.concatenate(numresults)  # Concatenate the results
  • 努巴
@njit
def compute_inplace_with_numba(array):
    np.sqrt(array,array)
    np.sin(array,array)
    np.cos(array,array)
    ## njit will compile this function to machine code
compute_inplace_with_numba(array_in_np_copy)

以下是計時結果:

In place in (  base Python): 11.42 seconds
In place in (Python Joblib): 4.59 seconds
In place in ( Python Numba): 2.62 seconds
In place in ( Python Numpy): 0.92 seconds

numba 出奇的慢! ?這是否是由於 mohawk2 在 IRC 交流中關於此問題所指出的編譯開銷所致?
為了測試這一點,我們應該在執行基準測試之前呼叫compute_inplace_with_numba一次。這樣做表明 Numba 現在比 Numpy 更快。

到位(基本Python):11.89秒 到位(Python Joblib):4.42秒 到位(Python Numpy):0.93 秒 到位(Python Numba):0.49 秒
In place in (  base Python): 11.89 seconds
In place in (Python Joblib): 4.42 seconds
In place in ( Python Numpy): 0.93 seconds
In place in ( Python Numba): 0.49 seconds
最後,我決定在同一個例子中使用基礎 R 進行騎行:


nIn place in ( base Python): 11.89 seconds In place in (Python Joblib): 4.42 seconds In place in ( Python Numpy): 0.93 seconds In place in ( Python Numba): 0.49 seconds 產生以下計時結果:


R基地時間:1.30秒
In place in (  base Python): 11.89 seconds
In place in (Python Joblib): 4.42 seconds
In place in ( Python Numpy): 0.93 seconds
In place in ( Python Numba): 0.49 seconds
與 Perl 結果相比,我們注意到此範例的以下內容:

    基礎 Python 中的就地操作比 Perl
  • 慢約 3.5 單線程 PDL 和 numpy 給出了幾乎相同的結果,緊隨其後的是基礎 R
  • 未能考慮 Numba 的編譯開銷會產生
  • 錯誤
  • 它比 Numpy 慢的印象。考慮到編譯開銷時,Numba 比 Numpy 快 2 倍 Joblib 的平行化確實改進了基礎 Python,但仍然不如單線程 Perl 實現
  • 多執行緒 PDL(和 OpenMP)碾壓(不是崩潰!)所有語言中的所有其他實作。 希望這個帖子 提供了一些值得思考的東西 用於下一次資料/計算密集型操作的語言。 本系列的下一部分將研究在 C 中使用陣列的相同範例。最後一部分將(希望)提供有關記憶體局部性的影響以及使用動態類型語言所產生的開銷的一些見解。
版本聲明 本文轉載於:https://dev.to/chrisarg/the-quest-for-performance-part-ii-perl-vs-python-5gdg?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • JavaScript的伴侶
    JavaScript的伴侶
    [2 了解JavaScript承諾 承諾是JavaScript中的一個強大功能,可以簡化處理異步操作的處理。它們提供了一種更清潔,更直觀的方式來處理異步代碼,避免了諸如“回調地獄”之類的問題。 什麼是諾言? 是一個代表異步操作的最終完成(或失敗)及其結果值的對象。它使...
    程式設計 發佈於2025-02-06
  • 如何在整個HTML文檔中設計特定元素類型的第一個實例?
    如何在整個HTML文檔中設計特定元素類型的第一個實例?
    [2單獨使用CSS,整個HTML文檔可能是一個挑戰。 the:第一型偽級僅限於與其父元素中類型的第一個元素匹配。 以下CSS將使用添加的類樣式的第一個段落: }
    程式設計 發佈於2025-02-06
  • 如何使用Flexbox將元素與容器的底部對齊?
    如何使用Flexbox將元素與容器的底部對齊?
    在提供的方案中使用FlexBox 在提供的方案中,您有一個帶有各種子元素的div容器。您的目的是實現一個佈局,而元素垂直堆疊,無論文本的高度如何。 flexbox通過自動保證金提供了解決此問題的解決方案。自動利潤率使剩餘空間在對齊之前的元素中分佈到具有自動邊緣的元素。實現所需佈局的一種方法是使用...
    程式設計 發佈於2025-02-06
  • 如何精確測量.NET中的方法執行時間?
    如何精確測量.NET中的方法執行時間?
    .NET方法執行時間的精確計算 引言: 確定方法的執行時間對於性能優化至關重要。有多種方法可以測量此指標,每種方法都有其優點和缺點。 最佳方法:Stopwatch .NET 中的Stopwatch功能專門用於測量執行時間,被認為是最準確和最直接的方法。使用方法如下: var watch = Sy...
    程式設計 發佈於2025-02-06
  • 如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    [2使用內置的char_length()function。 char_length()和length() 此查詢將從指定的表中檢索所有行,並基於上升順序對它們進行排序指定列的字符長度。帶有更長字符串的行將出現在結果的底部。
    程式設計 發佈於2025-02-06
  • 如何使用Python的記錄模塊實現自定義處理?
    如何使用Python的記錄模塊實現自定義處理?
    使用Python的Loggging Module 確保正確處理和登錄對於疑慮和維護的穩定性至關重要Python應用程序。儘管手動捕獲和記錄異常是一種可行的方法,但它可能乏味且容易出錯。 解決此問題,Python允許您覆蓋默認的異常處理機制,並將其重定向為登錄模塊。這提供了一種方便而係統的方法來捕獲...
    程式設計 發佈於2025-02-06
  • 哪種哈希算法最適合PHP中的安全密碼存儲?
    哪種哈希算法最適合PHP中的安全密碼存儲?
    安全密碼存儲:SHA1 vs MD5 VS SHA256 vs bcrypt bcrypt:首選選擇 通過password_hash()函數: //創建哈希 $ hash = password_hash($ password,password_default,['cost'=> ...
    程式設計 發佈於2025-02-06
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-02-06
  • 如何使用shell_exec()從php執行mySQL *.sql文件?
    如何使用shell_exec()從php執行mySQL *.sql文件?
    在PHP 中執行mysql *.sql文件時,在創建網站數據庫時,您可能會遇到需要執行的方案。 SQL文件從PHP到自動化站點生成。雖然zend_framework可能是有益的,但由於SQL語句中的不一致而直接運行。推薦的方法是使用Shell_exec()調用MySQL工具以執行您的 *.sql腳...
    程式設計 發佈於2025-02-06
  • 為什麼C#沒有用於IEnumerable的for Extension方法?
    為什麼C#沒有用於IEnumerable的for Extension方法?
    [2 [2 最近關於C#缺乏擴展方法的擴展方法] 界面? 有趣的是,只有 list 包括此功能。 [2 這是遺漏的性能優化嗎?還是有更深的根本原因? 幾種理論試圖解釋這一明顯的差距。 [2 一個觀點表明,C#的內置 [2 { item.dosomething(); } 這與擴展...
    程式設計 發佈於2025-02-06
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    解決此問題,我們採用了一個巧妙的CSS解決方案來解決問題:高度:100%; 高度:auto ; 寬度:100%; //對於水平塊 ,使用絕對定位將圖像定位在中心,以object-fit:object-fit :cover in IE和edge消除了問題。現在,圖像將按比例擴展,保持所需的效果而不...
    程式設計 發佈於2025-02-06
  • 如何將LINQ的聚合方法用於有效的字符串串聯?
    如何將LINQ的聚合方法用於有效的字符串串聯?
    與linq 的傳統方法涉及使用stringBuilder並在循環中附加每個字符串。但是,對於更有效的方法,LINQ提供了聚合查詢。 一個匯總查詢是一個函數,該函數獲取值集合併返回標量值。使用點通用,您可以在iEnumerable對像上調用聚合查詢。 與LINQ concateNate strin...
    程式設計 發佈於2025-02-06
  • PHP中整數的最大值是多少?
    PHP中整數的最大值是多少?
    在php中揭示了int值的限制:探索php_int_max 在PHP 未簽名的整數和php 確定整數大小和最大值 64位平台和int values 在摘要中,而PHP中的特定int值範圍取決於平台,典型的最大值大約為通常遇到20億。在與整數合作以確保准確的計算和有效的代碼執行時,了解這些限制至關重...
    程式設計 發佈於2025-02-06
  • 在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在ubuntu 使用debconf-set-selections sudo debconf-set-selections
    程式設計 發佈於2025-02-06
  • 如何在Python中生成具有小數步驟值的範圍?
    如何在Python中生成具有小數步驟值的範圍?
    在range()要克服此限制,建議將步驟值指定為在範圍內生成的點數。 Numpy庫提供了linspace函數,該功能需要多個點和可選的終點值。例如: np.linspace(0,1,10,endpoint = false)#返回[0,0.1,0.2,...,0.9] 如果使用浮點數步驟值,則Num...
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3