当前位置: 首页 > 面试题库 >

Python中高效的外部产品

南宫浩皛
2023-03-14
问题内容

当我们必须处理10k量纲的向量时,python的外部乘积似乎很慢。有人可以告诉我如何在python中加快此操作的速度吗?

代码如下:

 In [8]: a.shape
 Out[8]: (128,)

 In [9]: b.shape
 Out[9]: (32000,)

 In [10]: %timeit np.outer(b,a)
 100 loops, best of 3: 15.4 ms per loop

由于我必须多次执行此操作,因此我的代码越来越慢。


问题答案:

确实没有比这更快的速度,这些是您的选择:

numpy.outer

>>> %timeit np.outer(a,b)
100 loops, best of 3: 9.79 ms per loop

numpy.einsum

>>> %timeit np.einsum('i,j->ij', a, b)
100 loops, best of 3: 16.6 ms per loop

麻巴

from numba.decorators import autojit

@autojit
def outer_numba(a, b):
    m = a.shape[0]
    n = b.shape[0]
    result = np.empty((m, n), dtype=np.float)
    for i in range(m):
        for j in range(n):
            result[i, j] = a[i]*b[j]
    return result

>>> %timeit outer_numba(a,b)
100 loops, best of 3: 9.77 ms per loop

Parakeet

from parakeet import jit

@jit
def outer_parakeet(a, b):
   ... same as numba

>>> %timeit outer_parakeet(a, b)
100 loops, best of 3: 11.6 ms per loop

赛顿

cimport numpy as np
import numpy as np
cimport cython
ctypedef np.float64_t DTYPE_t

@cython.boundscheck(False)
@cython.wraparound(False)
def outer_cython(np.ndarray[DTYPE_t, ndim=1] a, np.ndarray[DTYPE_t, ndim=1] b):
    cdef int m = a.shape[0]
    cdef int n = b.shape[0]
    cdef np.ndarray[DTYPE_t, ndim=2] result = np.empty((m, n), dtype=np.float64)
    for i in range(m):
        for j in range(n):
            result[i, j] = a[i]*b[j]
    return result

>>> %timeit outer_cython(a, b)
100 loops, best of 3: 10.1 ms per loop

茶野

from theano import tensor as T
from theano import function

x = T.vector()
y = T.vector()

outer_theano = function([x, y], T.outer(x, y))

>>> %timeit outer_theano(a, b)
100 loops, best of 3: 17.4 ms per loop

py

# Same code as the `outer_numba` function
>>> timeit.timeit("outer_pypy(a,b)", number=100, setup="import numpy as np;a = np.random.rand(128,);b = np.random.rand(32000,);from test import outer_pypy;outer_pypy(a,b)")*1000 / 100.0
16.36 # ms

结论:

╔═══════════╦═══════════╦═════════╗
║  method   ║ time(ms)* ║ version ║
╠═══════════╬═══════════╬═════════╣
║ numba     ║ 9.77      ║ 0.16.0  ║
║ np.outer  ║ 9.79      ║ 1.9.1   ║
║ cython    ║ 10.1      ║ 0.21.2  ║
║ parakeet  ║ 11.6      ║ 0.23.2  ║
║ pypy      ║ 16.36     ║ 2.4.0   ║
║ np.einsum ║ 16.6      ║ 1.9.1   ║
║ theano    ║ 17.4      ║ 0.6.0   ║
╚═══════════╩═══════════╩═════════╝
* less time = faster


 类似资料:
  • 问题内容: 我正在尝试执行大型线性代数计算,以将通用协方差矩阵(形状)转换为缩小空间(形状)中的协方差矩阵图。 有关如何为每个空间位置进行构造的信息保存在其他数组中,和。前两个具有形状,第三个具有形状。观测空间与缩小空间之间的变换由特征向量(形状)处理。请注意> 。 的空间元素计算为: 理论上 ,第一个点积内的位 可以 直接使用来计算,但会占用数百GB的内存。我现在正在做的是遍历的空间索引,这非常

  • #Python中的这段非常简短的代码试图模拟前N个自然数的“Eratosthennes筛”,并限制(0)脚本长度;(1) 最小化“if语句”和“for/while循环”;(2) CPU时间方面的效率。 在Intel Core I5上,它返回第一个数字中的质数: < Li > 0.03秒内N = 100,000; < Li > 0.63秒内N = 1,000,000; < li>N = 10,000

  • 问题内容: 我有一个长度为m的n个向量的数组。例如,当 n = 3时 , m = 2 : 我想将每个向量的外积与自身相乘,然后将它们连接成形状为 (n,m,m) 的正方形矩阵的数组。所以对于以上我会得到 我可以像这样循环 是否有一个numpy表达式可以在没有Python循环的情况下执行此操作? 额外的问题:由于外部乘积是对称的,因此我不需要 mxm 乘法运算来计算它们。我可以从numpy获得这种对

  • 我正在大文本文件中搜索匹配项,但我发现它太慢了。这是文件结构: 我正在尝试匹配第一列的文本,我想提取第二列的值。列之间用\t隔开,大约有1000万行。用不同的单词多次搜索文件。什么搜索方法的时间效率最好? 编辑:文件大小为129 Mb,将被搜索至少数千次。EDIT2:文件是按字母顺序排序的,只有当单词有不同的大写字母时,它们才能出现多次。例如:单词都是不同的条目。

  • 安装jieba分词工具 在https://pypi.python.org/pypi/jieba/下载jieba-0.38.zip 解压后执行: python setup.py install 试验切词效果 创建testjieba.py文件内容如下: # coding:utf-8 #!/usr/local/bin/python import jieba seg_list = jieba.cut(

  • rank ▲ ✰ vote url 6 1161 520 1167 url 在Python中调用外部命令? 怎么在Python脚本里调用外部命令?(就好像直接输入在Unix shell中或者windows的命令行里) 来来来,我给你叨咕叨咕各种方法和各自优缺点: os.system("命令加参数")把命令和参数传递给你系统的shell中.用这个命令的好处在于你可以一次运行好多命令还可以设置管道来进