2016-01-22 117 views
1

爲什麼ctypes在我的代碼中比純python慢​​以增加一個變量?ctypes vs純python

from ctypes import * 
import timeit 

def f1(): 
    global t 
    t += 1 

def f2(): 
    p[0] += 1 

t = 0 
n = c_int(0) 
p = pointer(n) 

print(timeit.timeit("f1()", setup="from __main__ import f1")) # 0.3417885800008662 
print(timeit.timeit("f2()", setup="from __main__ import f2")) # 0.5280102270189673 

print(t) # 1000000 
print(n.value) # 1000000 

如何提高ctypes模塊的速度?

+0

也許一個有趣的閱讀:http://tungwaiyip.info/blog/2009/07/16/ctype_performance_benchmark –

+1

'p [0]'調用指針的'PyObject_GetItem',調用指針的'tp_as_mapping.mp_subscript',它是'Pointer_subscript',它調用'Pointer_item',它計算第0項的偏移量並獲取類型的'getfunc','i_get'(帶符號的C'int'),然後調用'PyCData_get',調用'i_get '的基地址和大小,它將值複製到堆棧上的C'int'中,並調用'PyInt_FromLong'來返回Python'int'。 – eryksun

+1

Python'int'和't'一樣增加。結果通過調用指針'tp_as_sequence.sq_ass_item'的'PyObject_SetItem'存儲,該指針爲'Pointer_ass_item',它計算第0項的偏移量並獲取類型的'setfunc','i_set',然後調用' PyCData_set',它調用具有基地址,值和大小的'i_set',從'PyInt_AsUnsignedLongMask'獲取值爲C'long',並將其轉換爲C'int'並複製到目標地址。 – eryksun

回答

5

實際的增量是一個非常簡單的操作,不太可能在大部分時間。更有可能的是這個函數自己調用,在f2的情況下,你有調用ctypes的開銷。

Ctypes通過允許您在C或C++中實現程序的非平凡,CPU密集型部分,可以提供性能提升。

+0

很明顯,但我認爲我使用的可能不是正確的ctypes。謝謝 ! – Fred