通过不引用引用其他变量的变量来优化python代码,依此类推

问题描述 投票:0回答:1

当我引用一个变量,然后再引用一个变量时,我有一个优化的问题,依此类推,我每次提到包含前一个变量的最后一个变量时,是否都会再次执行所有代码?

例如我的代码:

a = 5
b = 6
c = b * 2
d = a + c
e = c + d
f = e + d + c
g = f
h = g

[现在在我的代码中,我说print(h),是否必须重新计算所有内容,还是当我引用它们时python将所有值保存在内存中?当我在python中使用SQL和pandas时,我遇到了这个问题,当我连接到数据库时,获取需要的东西,转换数据,然后将其加载到数据框中,从原始数据库中创建3个新数据框,然后提到这3个具有1,000,000行和50列的数据帧之一,python是否会将所有这些百万条记录保留在内存中?

谢谢您的建议,我认为某处有一篇不错的文章对此进行了解释,但我没有完全找到所需的内容。

python optimization memory-management
1个回答
0
投票

那么您应该提出问题的简化版本以建立一个最小的示例。在这里,您的代码几乎是最少的,但不幸的是与所描述的问题无关。

涉及内存的关键是对象而不是变量。在Python中,变量不再是指向基础对象的名称。简单地说,一个对象将终止其生存期,并且一旦它不再可访问,即没有变量可以直接或间接访问它,就可以将其垃圾回收以释放内存。

示例:

a = "foo and bar"  # ok a addresses the string
b = a              # b addresses the same string (one single copy)
a += "s"           # oops...

字符串是不可更改的类型。然后,最后一行创建一个新字符串(用a寻址),而b仍然寻址旧字符串。在b = None之后,旧字符串将不再可用,并将被垃圾回收。

a = [1, 2, 3, 4]   # ok a point to the list
b = a              # b addresses the same list
a.append(5)        # oops...

列表是可变类型。 a.append(5)更改对象,并且ab现在都寻址列表[1、2、3、4、5]。只需使用print(a,b)即可看到...


现在是您的确切问题:

pandas底层容器是驻留在内存中的numpy数组。如果您现在可以访问3个不同的数据帧,则它们将出现在内存中。但是...熊猫经过了高度优化。这意味着,如果您使用子数据帧,并根据需要的细节,将获得可以独立于原始数据帧而进行更改的纯副本(内存中的重复项)或视图(使用的相同内存)。] >

让我们看一些熊猫的例子:

df是一个仅包含数字数据的1,000,000行数据框。所有这些行均已加载到内存中。

之后:

for i in range(2, 11):
    dg = df * i
    ...          # process dg

对于每个步骤,您都会构建数据框的新副本,但在下一步中将销毁它。长话短说,您将使用两倍的初始数据帧内存

dfs = [df * i for i in range(2, 11)]
for dg in dfs:
    ...         # process dg

这里您构建了9个新的数据帧,这些数据帧可以通过dfs进行访问,因此,您将以10个不同的数据帧结尾,并且需要10倍的初始内存。

© www.soinside.com 2019 - 2024. All rights reserved.