小编Tom*_*oim的帖子

在cython中迭代数组,列表比np.array更快?

TLDR:在cython中,为什么(或何时?)迭代一个numpy数组比迭代python列表更快?

一般来说:我之前使用过Cython并且能够在天真的python impl上获得巨大的速度,但是,弄清楚究竟需要做什么似乎并非无足轻重.

考虑以下3个sum()函数的实现.它们位于一个名为'cy'的cython文件中(很明显,这里有np.sum(),但除了我的观点之外......)

天真的蟒蛇:

def sum_naive(A):
   s = 0
   for a in A:
       s += a
   return s
Run Code Online (Sandbox Code Playgroud)

Cython的函数需要python列表:

def sum_list(A):
    cdef unsigned long s = 0
    for a in A:
        s += a
    return s
Run Code Online (Sandbox Code Playgroud)

Cython的函数需要一个numpy数组.

def sum_np(np.ndarray[np.int64_t, ndim=1] A):
    cdef unsigned long s = 0
    for a in A:
        s += a
    return s
Run Code Online (Sandbox Code Playgroud)

我希望,在运行时间方面,sum_np <sum_list <sum_naive,但是,下面的脚本演示相反(的完整性,我加np.sum())

N = 1000000
v_np = np.array(range(N))
v_list = range(N)

%timeit cy.sum_naive(v_list)
%timeit cy.sum_naive(v_np)
%timeit cy.sum_list(v_list)
%timeit cy.sum_np(v_np)
%timeit …
Run Code Online (Sandbox Code Playgroud)

python arrays optimization numpy cython

9
推荐指数
1
解决办法
6132
查看次数

如何有效地计算两个词典的内在产品

假设我使用字典表示一个特征向量(为什么?因为我知道这些特征是稀疏的,但稍后会详细介绍).

我该如何实现两个这样的词典的内在产品(表示为A,B)

我尝试了天真的方法:

for k in A:
  if k in B:
    sum += A[k] * B[k]
Run Code Online (Sandbox Code Playgroud)

但事实证明是缓慢的.

更多细节:

  • 我正在使用字典来表示功能,因为

    1. 功能键是字符串
    2. 有大约20K可能的键
    3. 每个向量都是稀疏的(例如,大约1000个非零元素).
  • 我真的很想计算N = 2000个不同字典(即它们的线性内核)的成对内积.

python linear-algebra

7
推荐指数
3
解决办法
5424
查看次数

标签 统计

python ×2

arrays ×1

cython ×1

linear-algebra ×1

numpy ×1

optimization ×1