- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个有效的 python 代码,但我想知道它是否可以更快。
我们总共有四个形状相同的二维输入数组。其中三个数组包含整数(将用作索引),另一个数组包含 double 。
要优化的函数需要将 double 组的值添加到 3D 数组中,位置由包含索引的数组定义。我的代码执行以下操作:
array_3D[index_one, index_two, index_three] += array_with_doubles
所以问题是:这是一种有效的编程方式吗?我不确定,但我希望 [ ] 索引符号可以被有效的东西取代。这个函数被调用了很多,并且占用了我的执行时间的+- 50%(根据snakeviz)。
另一种策略可能是减少 3D 数组的维度,尽管我可以想象代码的可读性会损失很多。
最佳答案
更简单的二维案例:
In [48]: index1=np.array([1,1,2,2,3,3,4,4]);
index2=np.array([0,2,1,2,3,4,4,5])
In [49]: data=np.arange(1,9)
In [50]: target=np.zeros((5,6))
In [53]: target[index1,index2]=data
In [54]: target
Out[54]:
array([[ 0., 0., 0., 0., 0., 0.],
[ 1., 0., 2., 0., 0., 0.],
[ 0., 3., 4., 0., 0., 0.],
[ 0., 0., 0., 5., 6., 0.],
[ 0., 0., 0., 0., 7., 8.]])
如果您“整理”索引,则可以使用 put
或 target.flat
:
In [51]: flatindex=np.ravel_multi_index((index1,index2),target.shape)
In [52]: flatindex
Out[52]: array([ 6, 8, 13, 14, 21, 22, 28, 29], dtype=int32)
In [58]: np.put(target,flatindex,data)
In [61]: target.flat[flatindex]=data
一些快速时间比较(对于 =data
,而不是 +=data
):
In [63]: timeit target[index1,index2]=data
100000 loops, best of 3: 6.63 µs per loop
In [64]: timeit np.put(target,flatindex,data)
100000 loops, best of 3: 2.47 µs per loop
In [65]: timeit target.flat[flatindex]=data
100000 loops, best of 3: 2.77 µs per loop
In [66]: %%timeit
....: flatindex=np.ravel_multi_index((index1,index2),target.shape)
....: target.flat[flatindex]=data
....:
100000 loops, best of 3: 7.34 µs per loop
target.flat[]=
是获胜者 - 如果已整理的索引已经可用。如果您对相同的索引数组重复应用此计算,则可能会出现这种情况。请记住,小型阵列上的时间测试可能与大型阵列上的时间测试不同。
使用 +=
代替,put
不起作用。即使必须计算 ravel
,flat
也具有速度优势:
In [78]: timeit target[index1,index2]+=data
100000 loops, best of 3: 16.2 µs per loop
In [79]: timeit target.flat[flatindex]+=data
100000 loops, best of 3: 7.45 µs per loop
In [80]: %%timeit
flatindex=np.ravel_multi_index((index1,index2),target.shape)
target.flat[flatindex]+=data
....:
100000 loops, best of 3: 13.4 µs per loop
但是 - 如果索引有重复,并且您希望添加所有 data
值,则问题会发生显着变化。像这样的直接索引使用缓冲,因此只有点的最后添加适用。
请参阅最近的 SO 问题来讨论此缓冲问题和替代方案
关于python - Numpy 数组 : Efficient use of arrays containing indices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313987/
我在一个数据集中有一个来自不同来源的姓名列表:一组按 FirstName LastName 组织;另一个有全名。我想查看名字或姓氏是否在全名列中,并创建一个标志。两个问题: 首先,我 u sed th
我一直认为不存在是正确的方法,而不是使用不存在条件。但是,我对我一直使用的查询进行比较,我注意到“Not In”条件的执行实际上似乎更快。任何关于为什么会出现这种情况的见解,或者如果到目前为止我只是做
我需要开发一个 iPad 应用程序,它应该管理两种方向模式(横向和纵向)。 根据 official Apple iOS documentation , 有 2 种方法可以继续。 -第一个包括在收到旋转
我有一个类有 2 个变量成员: class A: fullname = "" email = "" 内存中存储了一个A的列表,现在我需要针对全名或电子邮件进行搜索,搜索需要支持模糊搜索
哪个更有效率?或者它们都同样有效?带星号的行中的底层架构发生了什么? (1) for(int i = m_size; i > index; --i) { int k = normalize(
要检查两个不同日期范围的重叠,{Start1, End1} 和 {Start2, End2} 我正在检查: if ((Start1 = Start2)) { //overlap exists }
这个问题在这里已经有了答案: 关闭 13 年前. Possible Duplicate: Is there a performance difference between i++ and ++i i
前言: 学习ComfyUI是一场持久战, efficiency-nodes-comfyui是提高工作流创造效率的工具,包含效率节点整合工作流中的基础功能,比如Efficient Loader节点相当
我正在编写一个 Java 小程序,并且正在尝试读取一个 220K 行 (9.2 MB) 的文本文件,该文件是用 .jar 归档的。我相信我对文本文件的唯一合理访问是InputStream。为了使用 I
我有一个 Java 应用程序,需要播放一些不同的“声音/连复段”来指示状态。我想知道是否最好将这些记录为音频文件(wav 或任何格式)并使用 Java 音频类播放它们,或者存储 MIDI 数据并使用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
很抱歉这个问题太基本了。 目标:这是我的软件程序的输出: 1 590 SC 1.000 LEU2_YEAST 100% 1 590 EC 1.000 LEU2_ECOLI 10
重复使用 $(this) 是否有效,还是将其保存到变量中更好?我已经看到它在很多 jQuery 代码中重复使用,但由于它是对构造函数的调用,我认为它应该不必要地慢,我错了吗? 最佳答案 只是为了好玩
我正在考虑编写一个函数,该函数使用 calloc 创建一个数组来容纳文件中的数据(目前以字符形式)。据我了解,我的两个最明显的选择是读取所有字符以获得所需的总大小,使用 calloc 分配所需的空间,
好的,假设我有如下类: public class KPIObject // Data { get; set; } public string Caption { get; set; } } p
我想对表演者数组进行排序,以便他们按名字的第一个字符进行分组。例如,以下输出中的“A”代表名字以“A”开头的表演者的集合。 [ "A"[Performer,Performer,Performer,Pe
我正在使用此 MySQL 语句来查找社区的平均特性评估。问题是我必须为每个邻域添加一条 SELECT 语句——而且有很多邻域。有没有办法不必指定“RIVER FRONT”或“OLD TOWN”?有没有
我有许多表,大约有四个,我希望连接在一起。为了使我的代码更清晰和可读(对我而言),我希望一次加入所有代码,然后在最后过滤: SELECT f1, f2, ..., fn FROM t1 INNER J
我有以下代码: setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); # statement handle (prevents in
我有一个巨大的数据文件,我只需要这个文件中的特定数据,以后我会经常使用这些数据。那么这两种方法中哪一种更有效: 将此数据保存在全局变量(可能是 LinkedList)中,并在每次需要时使用它们 将它们
我是一名优秀的程序员,十分优秀!