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

为什么“ numpy.any”没有短路机制?

国跃
2023-03-14
问题内容

我不明白为什么尚未进行如此基本的优化:

In [1]: one_million_ones = np.ones(10**6)
In [2]: %timeit one_million_ones.any()
100 loops, best of 3: 693µs per loop

In [3]: ten_millions_ones = np.ones(10**7)
In [4]: %timeit ten_millions_ones.any()
10 loops, best of 3: 7.03 ms per loop

即使结论是第一项证据,整个阵列也会被扫描。


问题答案:

这是不固定的性能下降。NumPy发行3446。实际上 存在
短路逻辑,但是对ufunc.reduce机器的更改在短路逻辑周围引入了不必要的基于块的外循环,并且该外循环不知道如何短路。您可以在此处看到关于分块机制的一些解释。

即使没有回归,短路影响也不会出现在您的测试中。首先,您要确定数组的创建时间,其次,我认为它们没有为布尔值的任何输入dtype放入短路逻辑。从讨论中,听起来好像后面的减少ufunc的机制的细节numpy.any会变得如此困难。

讨论确实提出了令人惊讶的点,即argminandargmax方法似乎会因布尔输入而短路。快速测试显示,自NumPy
1.12(不是最新版本,而是Ideone当前使用的版本)开始,x[x.argmax()]短路,并且它胜过竞争,x.any()并且x.max()对于一维布尔输入,无论输入是小还是大,并且没有短路是否还很重要。奇怪的!



 类似资料:
  • 我面临的一些问题,没有收到通知在一些电话。我也不接受GCM的意图。这是我打电话给GCM注册时的日志。在像Nexus和Moto这样的手机上,它运行得非常好。但在Lava和Karbonn这样的低端手机上,我就面临着这个问题。 D/PowerManagerService(649):AcquireWakeLockInternal:lock=1114432392,Flags=0x1,tag=“gcm_con

  • 问题内容: 我可以通过将L附加到值来创建文字。为什么我不能以类似的方式创建字面量的short或byte?为什么我需要在转换时使用int文字? 如果答案是“因为C中没有短文字”,那么为什么C中没有短文字? 这实际上并没有以任何有意义的方式影响我的生活;写(短)0而不是0S很简单。但是这种矛盾使我感到好奇。这是当您深夜起床时困扰您的事情之一。有人在某个时候做出了设计决定,使得可以为某些原始类型输入文字

  • 我目前正在修复别人的Java代码中的一个bug,但我无法解释这个bug。所讨论的代码是下面的if语句: 其中初始化为和函数如下所示: 令我困惑的是,即使被设置为false,代码仍然调用并执行函数。我一直认为这是不应该发生的短路。if语句本身总体上仍然被计算为false,因为只有第一个代码段中的else-block中的代码被执行。 那么,这个if语句为什么会有这样的行为呢?是短路失败,还是我误解了原

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)

  • 这个问题不是关于优化代码的问题,而是一个关于短路逻辑运算符和普通逻辑运算符性能差异的技术问题,这可以归结为它们在硬件上如何执行。 是的,如果右操作数是昂贵的,那么尝试不求值它是有益的。但是对于像这样的简单条件,假设这些是原子变量,非短路逻辑运算符可能执行得更快。我说的对吗? 我假设短路逻辑运算符使用分支(没有官方来源,只是自己想的),因为如果不这样的话,你如何在按顺序执行指令的同时做出那些跳跃呢?