核心知识点:
(1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题。
(2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题。
(3)把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for子表达式中,即可将二者结合起来。
(4)串在一起的生成器表达式执行速度很快。
列表推导式的缺点是:在推导过程中,对于输入序列中的每个值来说,可能都要创建仅含一项元素的全新列表。
当输入的数据比较少时,不会出任何问题,但如果输入的数据非常多,那么可能会消耗大量内存,并导致程序崩溃。
所有的for循环都是将文件的内容依次读入到内存中。
例如,要读取一份文件并返回每行的字符数。若是采用列表推导来做,则需要把文件每一行的长度都保存在内存中。
如果这个文件特别大,或是通过无休止的network socket(网络套接字)来读取,那么这种列表推导就会出问题。
下面的这段列表推导代码,只适合处理少量的输入值。
[root@chenxing2 tmp]# cat /tmp/my_file.txt systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin cx:x:1000:1000:cx:/home/cx:/bin/bash mysql:x:1001:1001::/home/mysql:/sbin/nologin