在程序退出前执行代码的技巧
使用 atexit 这个内置模块,可以很方便的注册退出函数。
不管你在哪个地方导致程序崩溃,都会执行那些你注册过的函数。
示例如下:
实现类似 defer 的延迟调用
在 Golang 中有一种延迟调用的机制,关键字是 defer,例如下面的示例:
import “fmt”func myfunc {fmt.Println(“B”)}func main {defer myfuncfmt.Println(“A”)}
输出如下,myfunc 的调用会在函数返回前一步完成,即使你将 myfunc 的调用写在函数的第一行,这就是延迟调用。
AB
那么在 Python 中否有这种机制呢?
当然也有,只不过并没有 Golang 这种简便。
在 Python 可以使用上下文管理器达到这种效果:
import contextlibdef callback:print(‘B’)with contextlib.ExitStack as stack:stack.callback(callback)print(‘A’)
输出如下:
AB
如何流式读取数G超大文件
使用 with…open… 可以从一个文件中读取数据,这是所有 Python 开发者都非常熟悉的操作。
但是如果你使用不当,也会带来很大的麻烦。
比如当你使用了 read 函数,其实 Python 会将文件的内容一次性的全部载入内存中,如果文件有 10 个G甚至更多,那么你的电脑就要消耗的内存非常巨大。
# 一次性读取with open(“big_file.txt”, “r”) as fp:content = fp.read
对于这个问题,你也许会想到使用 readline 去做一个生成器来逐行返回。
def read_from_file(filename):with open(filename, “r”) as fp:yield fp.readline
可如果这个文件内容就一行呢,一行就 10个G,其实你还是会一次性读取全部内容。
最优雅的解决方法是,在使用 read 方法时,指定每次只读取固定大小的内容,比如下面的代码中,每次只读取 8kb 返回。
def read_from_file(filename, block_size = 1024 * 8):with open(filename, “r”) as fp:while True:chunk = fp.read(block_size)if not chunk:breakyield chunk
上面的代码,功能上已经没有问题了,但是代码看起来代码还是有些臃肿。
借助偏函数和 iter 函数可以优化一下代码:
from functools import partialdef read_from_file(filename, block_size = 1024 * 8):with open(filename, “r”) as fp:for chunk in iter(partial(fp.read, block_size), “”):yield chunk
本文来自作者:zhanzhan,不代表小新网立场!
转载请注明:https://www.xiaoxinys.cn/502585.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。