Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python效率:创建新变量并为其分配任务比继续使用相同的变量更好吗?_Python_Performance_Variables - Fatal编程技术网

Python效率:创建新变量并为其分配任务比继续使用相同的变量更好吗?

Python效率:创建新变量并为其分配任务比继续使用相同的变量更好吗?,python,performance,variables,Python,Performance,Variables,如果这个问题以前被问过很多次,我很抱歉,但我可能用了错误的术语来寻找答案 我使用的是Rasberry Pi,所以我关心效率。 在Python脚本中,我有一个名为foo的变量,我需要去掉它,然后列出它。 到目前为止,我的代码是这样的: foo = "hello, world" foo = foo[1:-1] #strip away the quotation marks. foo = foo.split(", ") #make a list of it 我的问题是:如果

如果这个问题以前被问过很多次,我很抱歉,但我可能用了错误的术语来寻找答案

我使用的是Rasberry Pi,所以我关心效率。 在Python脚本中,我有一个名为foo的变量,我需要去掉它,然后列出它。 到目前为止,我的代码是这样的:

 foo = "hello, world"
 foo = foo[1:-1]         #strip away the quotation marks.
 foo = foo.split(", ")   #make a list of it
我的问题是:如果我继续使用相同的变量,还是应该创建新的变量?或者我应该这样做:

foo = "hello, world"
bar = foo[1:-1]
fubar = bar.split(", ")
此外,foo变量每秒多次获得不同的字符串。 我的意思是,对于该变量的每个实例,都有一个新的内存分配,但这是否意味着我应该继续使用相同的变量呢


谢谢你们的回答,再次为这个愚蠢的问题道歉

这在很大程度上是一种风格选择。使用一个名字会稍微更有效率,并且避免在临时名称不再需要后留下它们,但这通常只是一个微不足道的区别。函数局部变量(无论如何在CPython中)只是作为指针存储在函数作用域的数组中;存储三个指针而不是一个指针不是一个有意义的区别,除非它最终使一个巨大的对象保持活动状态

当存储的数据的含义发生变化时,请使用新名称。特别是,在一个长函数中为完全不同类型或用途的数据重用一个变量是不好的(当它在第1-20行中有一个含义,在第40-50行中有一个不同的含义时,会使维护人员感到困惑)

在您的特定情况下,存储的前两个值似乎是相关的;重复使用这个名字可能没问题。不过,我对在
拆分之后重用名称持谨慎态度;切换变量类型通常是不好的形式(例外情况是当您对逻辑上表示一系列值的
str
进行初始解析时,这里可能就是这种情况)

基本上,不要不必要地混淆


旁注:当我看到
foo.split(“,”
)时,这就是代码气味。如果您使用的是CSV数据,请使用,不要使用带有可怕边缘情况和错误的CSV解析器。

就时间效率而言,这两种方法之间的差异可以忽略不计。解释器将需要动态分配内存,不管它们是否被同一个变量引用

就空间效率而言,一旦您离开python解释器的引用范围,它就会释放内存。例如,如果此操作在函数定义或循环内执行,则无论内存位于一个位置还是三个位置,每次激活此函数或循环结束时都会释放内存


出于这些原因,我建议坚持使用三个独立的变量,以便在稍后需要查看时清楚地表明您正在处理三个不同的概念信息。如果以后发现这已成为瓶颈,您可以随时返回并进行优化。

谢谢您的回答。foo变量是一个字符串,看起来像[“item1”、“item2”、“item3]”(是的,它看起来像一个列表,但实际上是一个字符串)。似乎使用剥离和拆分就足以完成这项工作。@user7074716:实际上,这里的正确解决方案可能是
json.loads(foo)
ast.literal\u eval(foo)
(取决于逻辑上是json还是逻辑上是Python literals)。这可以一次正确、高效地完成所有解析(同时剥离引号),并且不会出现奇怪的边缘情况(例如,您希望
[“foo,bar”,“baz”]
是两个元素,而不是三个元素,并且如果您的输入恰好忽略了逗号后的空格,您也不希望分割失败)。基本上,尽一切努力避免滚动您自己的解析器总是一个好主意;重新发明轮子很少会有好的结果。即使这只是一种情况?@user7074716:好吧,如果你只是在分析
'[“item1”,“item2”,“item3”]
,那么有效的解决方案就是执行
foo=[“item1”,“item2”,“item3”]
:-)但我猜你在分析其他东西。如果输入从未以任何方式违反您的期望,那么您的解决方案会更快。但要维护的代码更多,自我记录更少;如果它得到的数据确实略有不同,那么快速得到错误答案并不是“缓慢”得到正确答案的改进
json.load
相当快;除非分析表明这是一个问题,否则让Python来做这项工作。@user7074716:我做了微基准标记。如果将您的代码固定为同时删除foo.split(“,”)中x的引号(
foo=[x.strip(“””)])
,则三元素字符串的加载量将超过
json.loads(
)(按~2.5x的系数),这是因为
json.loads
调用本身的开销是恒定的,而设置
json.loads
也必须这样做。但它的扩展性更差;当您谈论1000个元素的字符串时(我使用了一个预计算的测试字符串
json.dumps(list(map(str,range(1000))
),
json.loads
以~3倍的优势获胜,因为它是C语言实现的,固定开销与减少的每项工作相比相形见绌。