Почему ctypes в моем коде медленнее, чем чистый python для увеличения переменной?ctypes vs pure 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 –
'р [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'. Результат сохраняется через 'PyObject_SetItem', который вызывает« tp_as_sequence.sq_ass_item »указателя, который является« Pointer_ass_item', который вычисляет смещение для 0-го элемента и получает тип 'setfunc',' i_set', а затем вызывает ' PyCData_set', который вызывает 'i_set' с базовым адресом, значением и размером, который получает значение C' long' из 'PyInt_AsUnsignedLongMask', которое он отличает как' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. – eryksun