為何Python這麼快

2021-04-06 12:27:43 字數 2348 閱讀 2505

問題的提出是源於 這位兄弟的blog,在他的這個實現中,python具有相當不錯的效能,不但優於帖子中的c實現效能,也優於隨後的跟貼中眾多的c++實現的效能。

在經過了多次嘗試,我還是很難找出乙個優於python效能的實現。這不是一件正常的事情,python的效能注定不會優於c/c++,這是因為python是解釋執行的,解釋的過程必然會消耗cpu時間,所以我查閱了python的原始碼試圖找出為何python對於這個任務有如此好的效能的原因。

任務描述如下

一些相關的實現,可以參看

這個位址

有如下的三個問題需要注意

對於這種大量的字串比較,直接使用字串比較函式是嚴重妨礙效能的

io效能是要注意的

盡可能的少使用占用記憶體

在我的嘗試中,發現重複呼叫 ofstream::operator<< 是比較影響效能的,而使用 fprintf或使用copy 等 stl 演算法輸出到則效能好的多。使用一種好的hash演算法是影響程式效能的關鍵。任務中的email字串總是具有[a-z]*[0-9]*@([a-z]*/.)+[a-z]* 的形式,例如 [email protected] [email protected] 的格式。

在$pysrc/objects/dictobject.c 中,對python的hash機制作了一些描述,總的來說,python的hash機制對於這種連續型的字串有相當好的離散度,對於這個 78w 例子,python_hash() % 780000能夠很均勻的分散到各個值,最大的衝突數為 8。 以下是按照類似 python的 hash演算法實現的 c++ 版本的結果

e:/workspace/temp/email>my

經過了1687.5000毫秒

e:/workspace/temp/email>my

經過了1718.7500毫秒

e:/workspace/temp/email>my

經過了1671.8750毫秒

e:/workspace/temp/email>my

經過了1656.2500毫秒

e:/workspace/temp/email>py_email.py

2.82014641526

e:/workspace/temp/email>py_email.py

2.74879181572

e:/workspace/temp/email>py_email.py

2.76348586203

e:/workspace/temp/email>dir *.txt

2006-03-28 13:09 19,388,869 email.txt

2006-03-29 22:51 17,779,266 email_new.txt (py_email.py 寫出)

2006-03-29 22:50 17,779,266 email_new_my.txt (my.exe 寫出)

py_email.py 的實現參看

這裡 my.cpp 實現如下 使用 cl /o2 /ehsc /d_crt_secure_no_deprecate my.cpp 編譯

#include #include using namespace std;

#define c_mul(a, b) (a * b & 0xffffffff)

size_t python_hash(const char * str)

value = value ^ len;

if (value == (size_t)-1)

value = (size_t)-2;

return value;

} size_t hash(const char * str, size_t seed = 1)

len++;

}

return h;

} #define max_table_size (780000)

#define max_confi 9

struct hash_item

bool check_has(const char * str)

items[item_count++] = key;

return false;

} };

int main( void )

getsystemtimeasfiletime( (lpfiletime)&t2 );

printf( "經過了%i64d.%04i64d毫秒/n", (t2-t1)/10000, (t2-t1)%10000 );

fclose(fin);

fclose(fout);

delete table;

}

大資料為何這麼重要?

在這10年中,幾乎所有行業都或多或少的受到大資料的影響。科技滲透到各個領域,並且已經成為每個處理單元的必要元素。談到it行業,具體來說,軟體和自動化是最基本的術語,並且用於處理迴圈的每個階段。毫無疑問,各行各業因為大幅爆發的資料而正變得蒸蒸日上。在這10年中,幾乎所有行業都或多或少的受到這一巨變的影...

大資料為何這麼重要?

在這10年中,幾乎所有行業都或多或少的受到大資料的影響。科技滲透到各個領域,並且已經成為每個處理單元的必要元素。談到it行業,具體來說,軟體和自動化是最基本的術語,並且用於處理迴圈的每個階段 毫無疑問,各行各業因為大幅爆發的資料而正變得蒸蒸日上。在這10年中,幾乎所有行業都或多或少的受到這一巨變的影...

檢查 ldf為何這麼大

testdb,只是個測試用檔案,備份時突然發現 ldf怎麼這麼大,當硬碟不要花銀子買啊.可隨意刪除.有空再檢查,累了休息.如批量生成資料 或匯入那個來自mysql的employees資料,然後再刪除掉,日誌檔案就會增加到18m,再匯入,再刪除就到了180m.bcp testdb.dbo.employ...