我应该使用以下哪一项?为什么?
import numpy as np
a = np.zeros([2, 3])
b = np.zeros((2, 3))
在很多情况下,你可以用任何一种方式传递参数,我只是想知道是否一种方式更Pythonic,或者是否有其他原因应该优先选择一种方式。
我查看了this question人们试图解释元组和列表之间的区别。这不是我感兴趣的,除非有我应该关心的原因,但我当然忽略了!
更新:
尽管使用 numpy 作为示例,但这通常适用于 python。一个非 numpy 的例子如下:
a = max([1, 2, 3, 5, 4])
b = max((1, 2, 3, 5, 4))
我不会编辑上面的内容,因为有些答案在解释中使用了 numpy
最佳答案
我在将可迭代的文字传递给构造函数或函数的上下文中回答这个问题,超出这些构造函数或函数的类型并不重要。如果需要传递可散列参数,则需要一个元组。如果您需要对其进行变异,请传入一个列表(这样您就不会将元组添加到元组,从而增加对象的创建。)
您的问题的答案是,更好的选择因情况而异。这是权衡。
从可变的 list
类型开始,它为将来的扩展预先分配内存:
a = np.zeros([2, 3])
优点:易于阅读。
缺点:浪费内存,而且性能较差。
接下来是tuple
类型,它是不可变的。它不需要为将来的扩展预先分配内存,因为它无法扩展。
b = np.zeros((2, 3))
专业版:它使用最少的内存,并且性能更高。
缺点:可读性稍差。
我的偏好是在考虑内存的情况下传递元组文字,例如,将被很多人使用的长时间运行的脚本。另一方面,当我使用交互式解释器时,我更喜欢传递列表,因为它们更具可读性,方括号和括号之间的对比便于视觉解析。
您应该只关心函数的性能,其中代码被编译为字节码:
>>> min(timeit.repeat('foo()', 'def foo(): return (0, 1)'))
0.080030765042010898
>>> min(timeit.repeat('foo()', 'def foo(): return [0, 1]'))
0.17389221549683498
最后,请注意,与其他考虑因素相比,性能考虑因素将显得相形见绌。使用Python是为了提高开发速度,而不是为了提高算法实现速度。如果你使用不好的算法,你的性能会差很多。它在许多方面也非常高效。我认为这只是重要的,因为它可以扩展,如果它可以改善大量使用的流程,避免因一千次切割而死亡。
关于python - 在需要列表或元组的情况下传递参数时要传递什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556410/