是python自动并行IO和CPU或内存绑定部分?

这是前一个的后续问题。

考虑一下这个代码,它比上一个问题中的代码要less一些 (但是比我的代码要简单得多)

import sys data=[] for line in open(sys.argv[1]): data.append(line[-1]) print data[-1] 

现在,我期待更长的运行时间(我的基准文件是65150224行),可能要长得多。 事实并非如此,与以前一样,在2分钟内运行!

它是data.append()非常轻量级? 我不这么认为,于是我写了这个假代码来testing它:

 data=[] counter=0 string="a\n" for counter in xrange(65150224): data.append(string[-1]) print data[-1] 

这运行在1.5到3分钟(运行间有很大的差异)

为什么我不能在以前的课程中学习3.5到5分钟? 显然,data.append()与IO并行发生。

这是个好消息!

但是它是如何工作的? 它是一个logging的function? 是否有我的代码的要求,我应该尽可能使其工作(除了负载平衡IO和内存/ CPU活动)? 还是只是简单的缓冲/caching行动?

再次,我标记了“linux”这个问题,因为我只对linux特定的答案感兴趣。 如果您认为值得这样做,那么可以随意给予操作系统不可知论者,甚至是其他操作系统的答案。

Solutions Collecting From Web of "是python自动并行IO和CPU或内存绑定部分?"

显然,data.append()与IO并行发生。

恐怕不是。 可能在Python中并行化IO和计算,但是这并不奇怪。

你可以做的一件事是使用posix_fadvise(2)给操作系统提示你打算顺序读取文件( POSIX_FADV_SEQUENTIAL )。

在一些粗略的测试中,在600兆文件(ISO)上执行“wc -l”,性能提高了大约20%。 清除磁盘缓存后,立即完成每个测试。

有关pyad -fadvise的Python接口,请参阅python-fadvise 。

文件中的行数有多大? 如果它们不是很长(大约1K以下的任何东西都可能),那么由于输入缓冲,您可能会看到性能提升。

为什么你认为list.append()会是一个较慢的操作? 这是非常快的,考虑到列表使用的内部指针数组保持对其中的对象的引用分配在越来越大的块,以便每个附加实际上不重新分配数组,大多数可以简单地增加长度计数器和设置一个指针并增加。

我没有看到任何证据表明“data.append()与IO并行发生”。 和Benji一样,我不认为这是自动的。 你表明做data.append(line [-1])的时间与lc = lc + 1大致相同(基本上没有时间,与IO和行分割相比)。 data.append(line [-1])非常快,这并不奇怪。 人们会期望整行快速缓存,正如附注中所提到的那样,提前准备好缓冲区,而且很少需要重新分配。 此外,line [-1]将始终为'\ n',除了文件的最后一行(不知道Python是如何优化的)。

我有点惊讶的是,xrange是如此的变化。 我希望它总是更快,因为没有IO,而且你实际上没有使用计数器。

如果第二个例子中你的运行时间变化了这个数量,那么我会怀疑你的计时方法或者外部影响(其他进程/系统负载)将时间偏移到他们没有给出任何可靠信息的地步。