簡體   English   中英

Cython:為什么size_t比int快?

[英]Cython: why is size_t faster than int?

從類型更改某些變量用Cython int輸入size_t可以顯著減少一些功能倍(〜30%),但我不明白為什么。

例如:

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的新手,比C.更了解Fortran。幫幫我。 這兩種變量類型之間的重要區別是什么導致了這種性能差異? 什么是我不喜歡Cython?

您可能不得不進行逐行分析以找出確切的結果,但有一件事從我生成的C文件中脫穎而出:檢查int版本是否為環繞負數, size_t假定為ok。

在int循環中:( t_3k分配,它們是相同的類型)

if (__pyx_t_3 < 0) {
  __pyx_t_3 += __pyx_v_A.shape[0];
  if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 0;
} else if (unlikely(__pyx_t_3 >= __pyx_v_A.shape[0])) __pyx_t_4 = 0;

在size_t循環中:

if (unlikely(__pyx_t_3 >= (size_t)__pyx_v_A.shape[0])) __pyx_t_4 = 0;

因此,不需要進行環繞測試,因為size_t是無符號的,並且保證在索引內存中的項目時不會size_t 其余幾乎是一樣的。

更新:關於你的unsigned int結果 - 你的int和size_t的大小是多少? 他們有什么不同的規模,導致變化? 在我的例子中,uint和size_t的C代碼是相同的。 (因為size_t是無符號的,在此系統上特別是unsigned int)

在64位系統上,似乎有兩個原因:

  1. 對循環使用無符號整數:

     %%cython cimport numpy as cnp import numpy as np def sum_int_unsigned(cnp.int64_t[::1] A): cdef unsigned long s = 0 cdef unsigned k for k in xrange(A.shape[0]): s += A[k] return s 
  2. 使用long而不是int

     %%cython cimport numpy as cnp import numpy as np def sum_int_unsigned_long(cnp.int64_t[::1] A): cdef unsigned long s = 0 cdef unsigned long k for k in xrange(A.shape[0]): s += A[k] return s 

時序:

%timeit sum_int(a)
1000 loops, best of 3: 1.52 ms per loop

%timeit sum_size_t(a)
1000 loops, best of 3: 671 µs per loop

使用unsigned將我們帶到了一半:

%timeit sum_int_unsigned(a) 
1000 loops, best of 3: 1.09 ms per loop

使用long帳戶來完成剩下的工作:

%timeit sum_int_unsigned_long(a)
1000 loops, best of 3: 648 µs per loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM