python解释器是否在进行动态优化?

时间:2018-10-30 10:05:49

标签: python numpy optimization dynamic-memory-allocation

例如,我有一个列表,我想转换为np.array。一个好方法(IMHO)是:

my_np_array = np.reshape(my_list,(200,200))

如果我是一个非常坏的人,我可以使用:

my_np_array = np.array(my_list).reshape(200,200)

甚至

useless_array = np.array(my_list)
useful_array = useless_array/reshape(200,200)

假设不再提到useless_array,python解释器是否能够将第二个和第三个语句转换为第一个?

编辑:当我问这个问题时,我正在考虑标准的3.7 python解释器,但我对任何能够执行优化的Python解释器/编译器都感兴趣。

1 个答案:

答案 0 :(得分:4)

是,不是。是的-python vm做了一些有限的优化。主要限制是python是动态的,您无法优化前面的大多数内容-与Java不同。一些实现比其他实现更“智能”。例如,pypy执行JIT编译,CPython执行一些低级技巧。

否— python(CPython)不执行变量内联,原因是您可以使用python -i non-optimized.py运行脚本,并且应该能够访问所有var。附加调试器也是如此。

基本上,一些性能优化是为动态性质而牺牲的,而某些性能优化尚未在实现中完成。

您的方法的旁注–性能相同,重塑非常便宜,并且不会影响内存结构。另外,实际上,您始终想分析您的代码,最好对它进行理论化:

In [11]: %timeit my_np_array = np.reshape(my_list,(200,200))                                                                                                                                                       
1.92 ms ± 3.76 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [12]: %timeit my_np_array = np.array(my_list).reshape(200,200)                                                                                                                                                  
1.92 ms ± 8.01 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [13]: %timeit useless_array = np.array(my_list); useful_array = useless_array.reshape(200,200)                                                                                                                  
1.92 ms ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)