我正在考慮用python代碼替換一些C代碼並使用pypy作爲解釋器。代碼做了很多列表/字典操作。因此,爲了弄清楚pypy vs C的性能,我正在編寫排序算法。爲了測試我所有的讀取函數,我使用python和C++編寫了一個冒泡排序。 CPython當然是6.468s,pypy是0.366s,C++是0.229s。然後我想起我已經忘記了-O3的C++代碼,時間到了0.042s。對於32768數據集,-O3的C++只有2.588s,pypy是19.65s。有什麼我可以做,以加快我的Python代碼(除了使用更好的排序算法,當然)或我怎麼使用pypy(一些標誌或什麼)?Pypy(Python)優化
Python代碼(省略read_nums模塊,因爲它的時間是微不足道的:0.036s上32768數據集):
import read_nums
import sys
nums = read_nums.read_nums(sys.argv[1])
done = False
while not done:
done = True
for i in range(len(nums)-1):
if nums[i] > nums[i+1]:
nums[i], nums[i+1] = nums[i+1], nums[i]
done = False
$ time pypy-c2.0 bubble_sort.py test_32768_1.nums
real 0m20.199s
user 0m20.189s
sys 0m0.009s
C代碼(read_nums函數再次省略,因爲它需要很少的時間:0.017s):
#include <iostream>
#include "read_nums.h"
int main(int argc, char** argv)
{
std::vector<int> nums;
int count, i, tmp;
bool done;
if(argc < 2)
{
std::cout << "Usage: " << argv[0] << " filename" << std::endl;
return 1;
}
count = read_nums(argv[1], nums);
done = false;
while(!done)
{
done = true;
for(i=0; i<count-1; ++i)
{
if(nums[i] > nums[i+1])
{
tmp = nums[i];
nums[i] = nums[i+1];
nums[i+1] = tmp;
done = false;
}
}
}
for(i=0; i<count; ++i)
{
std::cout << nums[i] << ", ";
}
return 0;
}
$ time ./bubble_sort test_32768_1.nums > /dev/null
real 0m2.587s
user 0m2.586s
sys 0m0.001s
PS第一段中給出的一些數字與時間的數字有些不同,因爲它們是我第一次得到的數字。
進一步的改進:
- 剛試過的xrange而不是範圍和運行時間去16.370s。
- 將代碼從第一個
done = False
開始移動到最後的done = False
,速度現在是8.771-8.834s。
如果使用像c代碼中那樣的tmp變量會發生什麼? – Claudiu 2013-03-27 17:59:36
W/xrange需要19.431s,w/xrange和tmp需要19.760s。不知道爲什麼我的xrange剛剛退步。 – CrazyCasta 2013-03-27 18:23:10
好吧,xrange no tmp顯然是一個異常值,我跑了5次,它的範圍是16.385s-17.158s。 tmp變量爲5次,範圍從18.923s-19.444s。 – CrazyCasta 2013-03-27 18:29:43