例如,我有一个列表,我想转换为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解释器/编译器都感兴趣。
答案 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)