【发布时间】:2010-01-29 15:36:28
【问题描述】:
我想知道 Python 在某些代码元素的执行顺序方面是否存在与 C 类似的问题。
例如,我知道在 C 中有时会说不能保证某个变量在另一个变量之前初始化。或者仅仅因为一行代码在另一行之上,不能保证它在它下面的所有代码之前实现。
Python 也一样吗?就像我打开一个数据文件,读入数据,关闭文件,然后做其他事情我是否确定在我关闭文件后的行执行之前文件已关闭??
我问的原因是因为我正在尝试读取一个大数据文件 (1.6GB) 并使用这个 python 模块特定于我对数据所做的工作。当我运行此模块时,我收到以下错误消息:
File "/glast01/software/ScienceTools/ScienceTools-v9r15p2-SL4/sane/v3r18p1/python/GtApp.py", line 57, in run
input, output = self.runWithOutput(print_command)
File "/glast01/software/ScienceTools/ScienceTools-v9r15p2-SL4/sane/v3r18p1/python/GtApp.py", line 77, in runWithOutput
return os.popen4(self.command(print_command))
File "/Home/eud/jmcohen/.local/lib/python2.5/os.py", line 690, in popen4
stdout, stdin = popen2.popen4(cmd, bufsize)
File "/Home/eud/jmcohen/.local/lib/python2.5/popen2.py", line 199, in popen4
inst = Popen4(cmd, bufsize)
File "/Home/eud/jmcohen/.local/lib/python2.5/popen2.py", line 125, in __init__
self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory
>>>
Exception exceptions.AttributeError: AttributeError("Popen4 instance has no attribute 'pid'",) in <bound method Popen4.__del__ of <popen2.Popen4 instance at 0x9ee6fac>> ignored
我假设它与我读入的数据的大小有关(它有 17608310 行和 22 列)。 我想也许如果我在读入数据后立即关闭我打开的文件,这会有所帮助,但它没有。这让我想到了代码行的执行顺序,因此我提出了问题。
谢谢
【问题讨论】:
-
我认为您需要更好地解释自己。在 C 中,给定
f(); g();,f()保证在g()之前被评估。在a = f() + g();中,C 中未指定求值顺序。Python 保证从左到右求值:docs.python.org/reference/expressions.html#evaluation-order -
“问题”是指“规则”,对吧?
-
是的,我知道我没有很好地解释自己,抱歉,这是因为我没有完全理解这一切,但也在尝试:) Alok:是的,这基本上就是我的想法。我认为它也适用于文件可能关闭的时间。我知道我可以说定义两个不同的函数并从第一个调用第二个(第二个我只是指在代码中较低),所以从这个意义上说,它也不一定按顺序完成。 kevindtimm:是的,我的意思是规则。我想我只是使用了工作问题,因为它给我带来了麻烦:)
-
@Jamie:请不要在您自己的问题上写大量、难以阅读的 cmets。请解决您的问题并删除您的 cmets。问题归您所有,您可以对其进行编辑,直到明确为止。
-
为什么关闭文件会影响内存消耗?如果您一次将 1.6G 的数据全部读取到您设计的任何内存结构中(据我们所知,这可能是非常不理想的),释放一个小文件句柄不会改变任何事情。您真的必须将整个文件加载到内存中,还是可以逐行处理文件?