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

快速python numpy的功能在哪里?

解沈义
2023-03-14
问题内容

我在多个for循环中多次使用numpy的where函数,但是它变得太慢了。有什么方法可以更快地执行此功能?我读到您应该尝试内联进行循环,并在for循环之前为函数创建局部变量,但是似乎没有什么可以提高速度的(<1%)。在len(UNIQ_IDS)〜800emiss_dataobj_datanumpyndarrays具有形状=(2600,5200)。我用import profile得到的瓶颈在哪里手柄,并且where在for循环是一个大的。

import numpy as np
max = np.max
where = np.where
MAX_EMISS = [max(emiss_data[where(obj_data == i)]) for i in UNIQ_IDS)]

问题答案:

事实证明,在这种情况下,纯Python循环比NumPy索引(或对np.where的调用)要快得多。

考虑以下替代方案:

import numpy as np
import collections
import itertools as IT

shape = (2600,5200)
# shape = (26,52)
emiss_data = np.random.random(shape)
obj_data = np.random.random_integers(1, 800, size=shape)
UNIQ_IDS = np.unique(obj_data)

def using_where():
    max = np.max
    where = np.where
    MAX_EMISS = [max(emiss_data[where(obj_data == i)]) for i in UNIQ_IDS]
    return MAX_EMISS

def using_index():
    max = np.max
    MAX_EMISS = [max(emiss_data[obj_data == i]) for i in UNIQ_IDS]
    return MAX_EMISS

def using_max():
    MAX_EMISS = [(emiss_data[obj_data == i]).max() for i in UNIQ_IDS]
    return MAX_EMISS

def using_loop():
    result = collections.defaultdict(list)
    for val, idx in IT.izip(emiss_data.ravel(), obj_data.ravel()):
        result[idx].append(val)
    return [max(result[idx]) for idx in UNIQ_IDS]

def using_sort():
    uind = np.digitize(obj_data.ravel(), UNIQ_IDS) - 1
    vals = uind.argsort()
    count = np.bincount(uind)
    start = 0
    end = 0
    out = np.empty(count.shape[0])
    for ind, x in np.ndenumerate(count):
        end += x
        out[ind] = np.max(np.take(emiss_data, vals[start:end]))
        start += x
    return out

def using_split():
    uind = np.digitize(obj_data.ravel(), UNIQ_IDS) - 1
    vals = uind.argsort()
    count = np.bincount(uind)
    return [np.take(emiss_data, item).max()
            for item in np.split(vals, count.cumsum())[:-1]]

for func in (using_index, using_max, using_loop, using_sort, using_split):
    assert using_where() == func()

以下是基准测试shape = (2600,5200):

In [57]: %timeit using_loop()
1 loops, best of 3: 9.15 s per loop

In [90]: %timeit using_sort()
1 loops, best of 3: 9.33 s per loop

In [91]: %timeit using_split()
1 loops, best of 3: 9.33 s per loop

In [61]: %timeit using_index()
1 loops, best of 3: 63.2 s per loop

In [62]: %timeit using_max()
1 loops, best of 3: 64.4 s per loop

In [58]: %timeit using_where()
1 loops, best of 3: 112 s per loop

因此,using_loop(纯Python)的运行速度比快11倍以上using_where。

我不完全确定为什么纯Python比NumPy更快。我的猜测是纯Python版本一次通过两个数组(是,是双关语)。它利用了这样一个事实,即尽管进行了所有花哨的索引编制,但实际上我们只想访问每个值一次。因此,它避免了必须确定每个值所属的组的问题emiss_data。但这只是模糊的推测。我不知道在进行基准测试之前会更快。



 类似资料:
  • 问题内容: 我没有代码示例或任何内容,因为我不知道该怎么做,但是有人可以告诉我如何在一定时间内迅速延迟功能吗? 问题答案: 您可以使用GCD(在示例中,延迟10秒): 迅捷2 Swift 3和Swift 4

  • 问题内容: 如果我上课: 我最初以为我可以通过添加扩展名来覆盖子类而无需子类化: 该代码不会编译,但错误说明了该函数,这很有意义。 我的问题是: 是否仍要重写特定类的功能?换句话说,在某些情况下,例如上面的示例中,我可以替换功能吗?如果没有,是否有其他解决方法或方法来实现该行为(可能声明了另一个协议,idk) 现在,我考虑得更多了,我不得不说这是不可能的,因为是什么阻止某人重写任何标准库函数? 问

  • WeX5作为一个快速前端开发利器,它不仅有丰富的组件和强大的能力,而且能快速与第三方的功能进行集成,今天介绍如何在WeX5中快速集成主流的地图功能:百度地图、高德地图和Mapbar地图。 集成百度地图 我们先看看集成后的运行效果: 代码实现: <div class="tab-content" xid="div1"> <div class="tab-pane active" xid="ta

  • 问题内容: 我正在尝试实现自动补全功能,但是找不到在Swift中可用的示例。下面,我打算转换Ray Wenderlich的自动完成教程 和2010年的示例代码。最后,代码进行了编译,但是没有显示包含可能完成的表格,而且我没有经验来了解为什么它未被隐藏shouldChangeCharactersInRange。 问题答案: 用下面的内容替换您的函数内容。希望对您有帮助。

  • 本文向大家介绍用Android Studio3.0新功能加快构建速度,包括了用Android Studio3.0新功能加快构建速度的使用技巧和注意事项,需要的朋友参考一下 Android Studio3.0很多新的功能,他们可以直接加快Android Studio的构建速度从而加快开发效率,构建速度直接影响到开发效率,浪费时间即浪费生命,可以通过修改一些配置,优化下构建速度。 Android St

  • 这是一个一般性问题。 我已经用透明重定向实现了Payflow Pro。我还实现了快速结账。在我的结账页面上,我想提供两种选择,例如立即付款或按照PayPal的建议使用PayPal结账。问题是,如果用户单击Pay Now,Payflow将用于处理交易,然后可以在PayPal Manager帐户报告中查看交易。如果用户单击“使用PayPal结账”,则只能通过进入PayPal帐户查看交易。 如何让“使用