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模塊的速度?
也許一個有趣的閱讀:http://tungwaiyip.info/blog/2009/07/16/ctype_performance_benchmark –
'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
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