gpt4 book ai didi

python - 装饰器会消耗更多内存吗?

转载 作者:行者123 更新时间:2023-12-02 06:46:47 24 4
gpt4 key购买 nike

在 Corey Schafer 教程中,他编写了以下代码来测量特定函数消耗的内存量。

import time
import random
import memory_profiler

names = ['john', 'Corey', 'Adam', 'Steve', 'Rick', 'Thomas']
majors = ['Math', 'Engineering', 'CompSci', 'Art', 'Business']
print('Memory (before): {}Mb'.format(memory_profiler.memory_usage()))

def people_list(num_of_people):
result = []
for i in range(num_of_people):
person = {'id': i,
'name' : random.choice(names),
'major' : random.choice(majors)}
result.append(person)
return result

t1 = time.process_time()
people_list(1000000)
t2 = time.process_time()
print('Memory (After): {}Mb'.format(memory_profiler.memory_usage()))
print('Took {} seconds'.format(t2-t1))

结果是

Memory (before): [34.21875]Mb
Memory (After): [34.47265625]Mb
Took 2.390625 seconds

但是当我尝试创建一个装饰器以将内存和时间测量功能添加到我的函数中时,函数执行前后的内存差异非常大。这是我的代码

import time
import random
import memory_profiler

names = ['john', 'Corey', 'Adam', 'Steve', 'Rick', 'Thomas']
majors = ['Math', 'Engineering', 'CompSci', 'Art', 'Business']

def decorator(original_func):
def wrapper(*args, **kwargs):
before_memory = memory_profiler.memory_usage()
print('Memory (before): {} Mbs'.format(before_memory))
t1 = time.time()
output = original_func(*args, **kwargs)
t2 = time.time()
time_diff = t2 - t1
after_memory = memory_profiler.memory_usage()
print("Memory (after): {} Mbs".format(after_memory))
print('{} ran in {} seonds'.format(original_func.__name__, time_diff))
return output
return wrapper

@decorator
def people_list(num):
result = []
for i in range(num):
person = {'id' : i+1,
'name' : random.choice(names),
'major' : random.choice(majors)}
result.append(person)
return result

people_list(1000000)

结果是

Memory (before): [47.07421875] Mbs
Memory (after): [319.875] Mbs
people_list ran in 2.5296807289123535 seonds

最佳答案

如果没有装饰器,您将立即丢弃函数调用的结果。在装饰器示例中,在查看内存使用情况时,结果保存在输出中。

尝试第一个示例:

t1 = time.process_time()
output = people_list(1000000)
t2 = time.process_time()
print('Memory (After): {}Mb'.format(memory_profiler.memory_usage()))
print('Took {} seconds'.format(t2-t1))

并且您应该获得相同的内存使用量。

关于python - 装饰器会消耗更多内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59491221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com