2016-01-22 2 views
1

Почему 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?

+0

Может быть интересно читать: http://tungwaiyip.info/blog/2009/07/16/ctype_performance_benchmark –

+1

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

ответ

5

Фактический прирост - очень простая операция и вряд ли займет большую часть времени. Скорее всего, сама функция вызывает вызовы, а в случае f2 у вас есть накладные расходы на вызов в ctypes.

Cтипы могут обеспечить прирост производительности, позволяя вам реализовать нетривиальные, интенсивные для процессора части вашей программы на C или C++.

+0

Это ясно, но я думал, что использую, возможно, не правильно ctypes. Благодаря ! – Fred