装饰器消耗更多内存吗?

Amm*_*ser 3 python memory decorator

在 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))
Run Code Online (Sandbox Code Playgroud)

结果是

Memory (before): [34.21875]Mb
Memory (After): [34.47265625]Mb
Took 2.390625 seconds
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

结果是

Memory (before): [47.07421875] Mbs
Memory (after): [319.875] Mbs
people_list ran in 2.5296807289123535 seonds
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 6

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

尝试第一个示例:

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))
Run Code Online (Sandbox Code Playgroud)

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