![]() |
1
23
python的编译器故意地非常简单——这使得它快速且高度可预测。除了一些持续的折叠之外,它基本上生成了忠实地模仿源代码的字节码。已经有人建议了
dis
这确实是一个很好的方法来查看您得到的字节码——例如,如何
所以这里有足够的空间进行手动微优化——尤其是提升。即重写
作为
保存重复的查找(编译器不检查
这个
timeit
模块(最好在shell提示imho中使用)使得测量编译和字节码解释的整体效果变得非常简单(只要确保要测量的代码片段没有影响计时的副作用,因为
您可以看到重复列表构建的成本——并通过尝试一个小的调整来确认这确实是我们观察到的:
将Iterable的结构移动到
装备
所以我们看到:实例化一个新样式的类和调用一个函数(都是空的)的速度大致相同,而实例化可能有一个很小的速度差,可能是5%;实例化一个旧样式的类的速度最慢(大约是50%)。微小的差别,如5%或更少当然可能是噪音,所以每次重复几次是明智的;但像50%的差别肯定远远超过噪音。
在这里我们看到:打电话
…我们看到事实确实如此:如果将两个数字中的一个或两个都作为变量进行查找(这会阻止不断折叠),我们将支付“现实”成本。变量查找有其自身的成本:
不管怎样,当我们试图测量这么小的时间时,这绝不是微不足道的。的确 常数 查找也不是免费的:
如您所见,虽然比变量查找小,但它是相当可比的——大约有一半。 如果(有了仔细的分析和测量)您决定计算的一些核心非常需要优化,我建议您尝试 cython --这是一个C/python合并,它尝试着像python一样整洁,像c一样快,虽然它不能100%达到目标,但它确实是一个很好的拳头(特别是,它使二进制代码比前代语言快得多, pyrex 以及比它更富有一点)。对于性能的最后几个百分点,您可能仍然希望使用C(或者在某些特殊情况下使用汇编/机器代码),但这将是非常罕见的。 |
![]() |
2
6
洛特是对的:主要影响是数据结构和算法。另外,如果你做了大量的I/O,你如何管理它将产生很大的影响。 但是,如果您对编译器的内部结构感兴趣:它将折叠常量,但不会内联函数或展开循环。内嵌函数是动态语言中的一个难题。 您可以通过分解一些已编译的代码来查看编译器的工作。在my_file.py中放入一些示例代码,然后使用:
这个来源:
生产:
请注意,只有模块中的顶级代码是反汇编的,如果希望看到反汇编的函数定义,您还需要自己编写一些代码,以便在嵌套的代码对象中循环。 |
![]() |
3
6
|
![]() |
4
4
这是有趣的。
这些将产生巨大的改善。 您的列表有助于(最多)提高几个位数的性能。 如果您想看到真正的速度改进,就需要从根本上重新考虑数据结构。 |
![]() |
5
4
如果您已经知道您的算法尽可能快,并且您知道C会快得多,那么您可能希望在C中实现代码的核心作为 C extension to Python . 您可以实用主义地决定代码的哪一部分使用C语言,哪一部分使用Python语言,并充分利用每种语言的潜力。 与其他语言不同,C和Python之间的调用速度非常快,因此经常跨越边界不会受到惩罚。 |
|
6
4
我是《阿劳娜》的作者。我对Python一无所知,但我知道Arauna非常优化,包括高级(数据结构和算法)和低级(缓存友好代码、SIMD和多线程)。这是一个很难达到的目标… |
![]() |
Sweepy Dodo · JSON lite的格式化 5 月前 |
![]() |
giantjenga · 优化整数向量到二进制向量的转换 7 月前 |
![]() |
Zegarek · Postgresql递归查询未提供预期结果 7 月前 |
![]() |
Joe · 为什么这两个查询之间的性能存在如此大的差异? 10 月前 |
![]() |
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 10 月前 |
![]() |
Mohan · 是否有一种更快的方法来编写代码,从1:N中提取许多随机样本? 11 月前 |
![]() |
user2980746 · 在C#字典中键入xyz对的最有效方法是什么? 11 月前 |