最稀有的R卡,ef延迟加载和直接加载

最稀有的R卡,ef延迟加载和直接加载

在程序退出前执行代码的技巧

使用 atexit 这个内置模块,可以很方便的注册退出函数。

不管你在哪个地方导致程序崩溃,都会执行那些你注册过的函数。

示例如下:

最稀有的R卡,ef延迟加载和直接加载

实现类似 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 最稀有的R卡,ef延迟加载和直接加载

如何流式读取数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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。