Python “如何加速”;for loop";在蟒蛇3中

Python “如何加速”;for loop";在蟒蛇3中,python,python-3.x,numpy,vectorization,Python,Python 3.x,Numpy,Vectorization,下面的代码运行得很慢。我尝试使用numpy.argwhere而不是“if statement”来加快代码的速度,我得到了一个非常有效的结果,但仍然非常缓慢。我还尝试了numpy.frompyfunc和numpy.vectorize,但失败了。您建议如何加速下面的代码 import numpy as np import time time1 = time.time() n = 1000000 k = 10000 velos = np.linspace(-1000, 1000, n) line

下面的代码运行得很慢。我尝试使用
numpy.argwhere
而不是“if statement”来加快代码的速度,我得到了一个非常有效的结果,但仍然非常缓慢。我还尝试了
numpy.frompyfunc
numpy.vectorize
,但失败了。您建议如何加速下面的代码

import numpy as np
import time

time1 = time.time()

n = 1000000
k = 10000

velos = np.linspace(-1000, 1000, n)
line_centers = np.linspace(-1000, 1000, k)
weights = np.random.random_sample(k)
rvs = np.arange(-60, 60, 2)

m = len(rvs)
w = np.arange(10)
M = np.zeros((n, m))
for l, lc in enumerate(line_centers):
    vi = velos - lc

    for j in range(m - 1):
        w = np.argwhere((vi < rvs[j + 1]) & (vi > rvs[j])).T[0]

        M[w, j] = weights[l] * (rvs[j + 1] - vi[w]) / (rvs[j + 1] - rvs[j])
        M[w, j + 1] = weights[l] * (vi[w] - rvs[j]) / (rvs[j + 1] - rvs[j])

time2 = time.time()

print(time2 - time1)
将numpy导入为np
导入时间
time1=time.time()
n=1000000
k=10000
velos=np.linspace(-1000,1000,n)
直线中心=np.linspace(-1000,1000,k)
权重=np.随机.随机样本(k)
rvs=np.arange(-60,60,2)
m=长度(rvs)
w=np.arange(10)
M=np.零((n,M))
对于l,枚举中的lc(行_中心):
vi=velos-lc
对于范围(m-1)内的j:
w=np.argwhere((virvs[j]).T[0]
M[w,j]=权重[l]*(rvs[j+1]-vi[w])/(rvs[j+1]-rvs[j])
M[w,j+1]=权重[l]*(vi[w]-rvs[j])/(rvs[j+1]-rvs[j])
time2=time.time()
打印(时间2-时间1)
编辑:
数组
M
的大小不正确。我修好了 当然很慢,您有两个嵌套循环!您需要重新考虑使用向量运算的算法,例如,不在索引上迭代,而是根据索引或布尔数组以及索引移位来实现

您没有提供任何背景信息,因此任何人都很难提出有意义的建议(考虑到示例中的大量索引)。基于快速收集示例的一些快速建议

  • 像这样的表达式
    (rvs[j+1]-rvs[j])
    很容易替换为
  • 您似乎正在以
    m
    的块迭代
    n
    ,可能会有用
  • 我有一种预感,你的内部循环有一个错误,你确定你真的要在
    范围(m-1)
    上迭代吗?这意味着您正在从
    0
    迭代到
    m-2
    (包括),我怀疑您的意思

如果您提供更多的背景信息,我们可以帮助您提供更具体的答案。

您可能想看看numba:我会看看的。谢谢。如果您想使用Numba,请在一个简单的嵌套循环中写出所有内容(没有像argwhere这样的矢量化命令),请注意从代码中删除
argwhere
(例如,将其替换为常量
w=1
,循环速度将提高20倍。因此,如果您可以重写它,您的代码可能已经快得多了。嵌套循环在这里可能不太重要。我曾想过用C++编写包装器。但后来我想知道它是否有针对python的解决方案。Pybind11看起来对这一点很有用。)用途。谢谢。我分享了原始代码中的一部分作为示例。很难解释我想用这段代码做什么,所以我没有提供足够的背景信息,对不起。
range(m-1)
是数组
m
索引的
j+1
所必需的。我将尝试你的建议,并将结果写在这里。谢谢。