在使用math.sqrt(…)
的REPL中将… ** 0.5
与内置二进制运算符timeit.timeit(…)
进行比较时,看起来二进制运算符在{{1} }模块功能:
…尽管我必须将迭代次数提高到1,000,000,才能获得可见的差异(请注意,我确实通过直接从math
导入sqrt
来补偿模块功能的查找开销在相关测试中)。
在这种情况下,我还没有研究过检查更明显的现成的优化代码路径,例如通过扩展程序或math
模块调用libm
函数–因为我正努力坚持新年的决议,所以一周不宜过早优化一次; unlike other related-question-askers,我追求性能的整数结果正确性。
这是当前同步的图像处理功能的热循环中的一项操作,该功能使用PIL / Pillow到render an image as a monotone dot-screen halftone ‡,这现在也大约两个数量级慢;由于当前使用的是Pillow的矢量绘图API,因此无法轻易cython
化或cythion
化(但是,仅供参考,我不怕与问题的那些要素保持距离;因为例如,我已经用faster and less overhead-y bespoke functions替换了对枕头numpy
包的调用,这样做是可以证明的,完全不是优化的过早动作。
我的问题是:这两种方法(和/或我未提及的任何其他平方根方法)的重要优点和缺点是什么?无论是一般意义上的还是与之密切相关的Python数学环境?而且,更重要的是,这些问题是否已被其他问题所掩盖,例如上述诸如属性查找,函数分派之类的开销问题?
我经常发现,作为一个单元,对每个元素都有直接的性能答案,但是当Python代码需要满足性能标准时,所有这些次要问题都会引起误解,这是一个灰色误区–因此,我我特别希望能听到任何从事此类问题工作并了解应认真对待的人的消息。
•半色调代码本身的沿袭来自this excellent and time-tested SO answer。