python - 循环列表比循环 ndarray 快 20 倍

标签 python performance list numpy cython

我不明白为什么在下面的循环中,f?cf? 慢 20 倍。

我了解类型定义允许 Cython 利用 C 速度。

我在这里缺少什么?

谢谢

%%cython
import numpy as np
cimport numpy as np


cpdef f1(l):
    for k in l:
        k

cpdef f1c(np.ndarray npl):
    cdef int i = 0
    for i in range(npl.shape[0]):
        npl[i]

cpdef f2(n):
    for k in n:
        k

cpdef f2c(np.ndarray npn):
    cdef int i = 0
    for i in range(npn.shape[0]):
        npn[i]

以及时间安排:

l = ["lol"]*100000
npl = np.array(l, dtype=np.str)

n = [1]*100000
npn = np.array(n, dtype=np.int)



%timeit f1(l)

%timeit f1c(npl)

%timeit f2(n)

%timeit f2c(npn)

1000 loops, best of 3: 484 µs per loop
100 loops, best of 3: 13.1 ms per loop
1000 loops, best of 3: 483 µs per loop
100 loops, best of 3: 12.4 ms per loop

最佳答案

当您指定数据类型和数组的维数时,numpy 上的循环速度至少快一个数量级:

def f2c(np.ndarray[np.int_t, ndim=1] npn):
    cdef int i = 0
    for i in range(npn.shape[0]):
        npn[i]

同样,对于字符串大小写,我的循环速度提高了两倍:

def f1c(np.ndarray[object, ndim=1] npl):
    cdef int i = 0
    for i in range(npl.shape[0]):
        npl[i]

在这种情况下您必须使用:

npl = np.array(l, dtype=object)

关于python - 循环列表比循环 ndarray 快 20 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128893/

相关文章:

python - 两个数据列表的相关性

C++计时,自上一秒以来的毫秒数

python - Python 中的字典分组和聚合列表

python - 如何在 Python 3 中减去嵌套列表中的元素?

python - 为什么没有 OpenBLAS 的 numpy/scipy 更快?

python - Google 日历 API 与 Python 集成 - 在日历 API 中更改发件人的邮件地址

python - 在整个天空的网格上绘制 FITS 图像

c# - 配置等待和性能

c# - 如何在不更新容器的情况下从容器中删除控件

c# - 使用 asp.net 和 C# 列出目录中的文件夹