Изменение некоторых переменных Cython от типа int
до типа size_t
может значительно сократить время выполнения некоторых функций (~ 30%), но я не понимаю, почему.Cython: почему size_t быстрее, чем int?
Например:
cimport numpy as cnp
import numpy as np
def sum_int(cnp.int64_t[::1] A):
cdef unsigned long s = 0
cdef int k
for k in xrange(A.shape[0]):
s += A[k]
return s
def sum_size_t(cnp.int64_t[::1] A):
cdef unsigned long s = 0
cdef size_t k
for k in xrange(A.shape[0]):
s += A[k]
return s
a = np.array(range(1000000))
И временные результаты:
In [17]: %timeit sum_int(a)
1000 loops, best of 3: 652 µs per loop
In [18]: %timeit sum_size_t(a)
1000 loops, best of 3: 427 µs per loop
Я новичок в Cython, и знаю Fortran лучше, чем C. Помогите мне. Какое важное различие между этими двумя типами переменных вызывает такую разницу в производительности? Что я не понимаю о Китоне?
вы проверили сгенерированную сборку? –
@ KarolyHorvath Я попытался посмотреть сгенерированный код C, но почти ослеп. Я уверен, что он очень оптимизирован, но поскольку я больше человек из Фортрана, авто-сгенерированный C был довольно трудно читать. – theJollySin
Вы берете массив 'int64_t'. Почему бы не использовать 'int64_t' для вашего аккумулятора? – user2357112