簡體   English   中英

C程序比Python子進程更快

[英]C program is faster as Python subprocess

我在C中有一個多線程mergesorting程序,以及一個用0,1,2或4個線程進行基准測試的程序。 我還用Python編寫了一個程序來進行多項測試並匯總結果。

奇怪的是,當我運行Python時,測試總是在大約一半的時間內運行,而不是直接在shell中運行它們。

例如,當我用400萬個整數運行測試程序進行排序時(最后兩個參數是生成整數的種子和模數):

$ ./mergetest 4000000 4194819 140810581084
0 threads:  1.483485s wall;  1.476092s user;  0.004001s sys
1 threads:  1.489206s wall;  1.488093s user;  0.000000s sys
2 threads:  0.854119s wall;  1.608100s user;  0.008000s sys
4 threads:  0.673286s wall;  2.224139s user;  0.024002s sys

使用python腳本:

$ ./mergedata.py 1 4000000
Average runtime for 1 runs with 4000000 items each:
0 threads:   0.677512s wall;   0.664041s user;   0.016001s sys
1 threads:   0.709118s wall;   0.704044s user;   0.004001s sys
2 threads:   0.414058s wall;   0.752047s user;   0.028001s sys
4 threads:   0.373708s wall;    1.24008s user;   0.024002s sys

無論我排序多少,或者我運行多少次,都會發生這種情況。 python程序使用子進程模塊調用測試程序,然后解析並聚合輸出。 有什么想法會發生這種情況嗎? Python以某種方式優化執行嗎? 或者當我直接運行它時,有什么東西會減慢它我不知道的?

代碼: https//gist.github.com/2650009

結果我將sys.maxint傳遞給子進程作為生成隨機數的模數。 C正在截斷64位整數並將其解釋為有符號,即在二進制補碼中為-1,因此每個隨機數都由此修改並變為0.因此,對所有相同值進行排序似乎需要大約一半很多時間作為隨機數據。

將它包裝在shell腳本中可能會產生相同的效果。 如果是這樣它的控制台操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM