为了以 Jim 的回答为基础并解决您的性能问题,我使用 python 的dis
模块来比较两个语法不同但功能等效的函数的字节码指令。
import dis
def f1():
a = "test"
return f"{a}"
def f2():
return "{a}".format(a='test')
print(dis.dis(f1))
print(dis.dis(f2))
结果是:
11 0 LOAD_CONST 1(“测试”)
2 STORE_FAST 0 (一)
12 4 加载快速 0 (一)
6 FORMAT_VALUE 0
8 RETURN_VALUE
没有任何
15 0 LOAD_CONST 1 ('{a}')
2 LOAD_ATTR 0(格式)
4 LOAD_CONST 2 ('测试')
6 LOAD_CONST 3 (('a',))
8 CALL_FUNCTION_KW 1
10 返回值
没有任何
可以看到 f-string 处理格式化时没有属性或函数调用,这可能会导致类型检查和内存开销。根据timeit
这导致大约 3 倍的性能增益(对于我的特定功能)
>>> timeit.timeit('f1()', 'from __main__ import f1', number=100000)
0.012325852433775708
>>> timeit.timeit('f2()', 'from __main__ import f2', number=100000)
0.036395029920726074