python 中每个函数的内存使用情况
Memory usage per function in python
import time
import logging
from functools import reduce
logging.basicConfig(filename='debug.log', level=logging.DEBUG)
def read_large_file(file_object):
"""Uses a generator to read a large file lazily"""
while True:
data = file_object.readline()
if not data:
break
yield data
def process_file_1(file_path):
"""Opens a large file and reads it in"""
try:
with open(file_path) as fp:
for line in read_large_file(fp):
logging.debug(line)
pass
except(IOError, OSError):
print('Error Opening or Processing file')
def process_file_2(file_path):
"""Opens a large file and reads it in"""
try:
with open(path) as file_handler:
while True:
logging.debug(next(file_handler))
except (IOError, OSError):
print("Error opening / processing file")
except StopIteration:
pass
if __name__ == "__main__":
path = "TB_data_dictionary_2016-04-15.csv"
l1 = []
for i in range(1,10):
start = time.clock()
process_file_1(path)
end = time.clock()
diff = (end - start)
l1.append(diff)
avg = reduce(lambda x, y: x + y, l1) / len(l1)
print('processing time (with generators) {}'.format(avg))
l2 = []
for i in range(1,10):
start = time.clock()
process_file_2(path)
end = time.clock()
diff = (end - start)
l2.append(diff)
avg = reduce(lambda x, y: x + y, l2) / len(l2)
print('processing time (with iterators) {}'.format(avg))
程序输出:
C:\Python34\python.exe C:/pypen/data_structures/generators/generators1.py
processing time (with generators) 0.028033358176432314
processing time (with iterators) 0.02699498330810426
在上面的程序中,我试图测量使用 iterators
和使用 generators
打开读取大文件所花费的时间。该文件可用 here。使用迭代器读取文件的时间比使用生成器读取文件的时间要短得多。
我假设如果我要测量函数 process_file_1
和 process_file_2
使用的内存量,那么生成器的性能将优于迭代器。有没有办法测量 python.
中每个函数的内存使用情况
首先,使用代码的单次迭代来衡量其性能并不是一个好主意。由于系统性能的任何故障(例如:后台进程、cpu 进行垃圾收集等),您的结果可能会有所不同。您应该检查它是否有相同代码的多次迭代。
为了衡量代码的性能,使用timeit
模块:
This module provides a simple way to time small bits of Python code. It has both a Command-Line Interface as well as a callable one. It avoids a number of common traps for measuring execution times.
要检查代码的内存消耗,请使用Memory Profiler
:
This is a python module for monitoring memory consumption of a process as well as line-by-line analysis of memory consumption for python programs.
import time
import logging
from functools import reduce
logging.basicConfig(filename='debug.log', level=logging.DEBUG)
def read_large_file(file_object):
"""Uses a generator to read a large file lazily"""
while True:
data = file_object.readline()
if not data:
break
yield data
def process_file_1(file_path):
"""Opens a large file and reads it in"""
try:
with open(file_path) as fp:
for line in read_large_file(fp):
logging.debug(line)
pass
except(IOError, OSError):
print('Error Opening or Processing file')
def process_file_2(file_path):
"""Opens a large file and reads it in"""
try:
with open(path) as file_handler:
while True:
logging.debug(next(file_handler))
except (IOError, OSError):
print("Error opening / processing file")
except StopIteration:
pass
if __name__ == "__main__":
path = "TB_data_dictionary_2016-04-15.csv"
l1 = []
for i in range(1,10):
start = time.clock()
process_file_1(path)
end = time.clock()
diff = (end - start)
l1.append(diff)
avg = reduce(lambda x, y: x + y, l1) / len(l1)
print('processing time (with generators) {}'.format(avg))
l2 = []
for i in range(1,10):
start = time.clock()
process_file_2(path)
end = time.clock()
diff = (end - start)
l2.append(diff)
avg = reduce(lambda x, y: x + y, l2) / len(l2)
print('processing time (with iterators) {}'.format(avg))
程序输出:
C:\Python34\python.exe C:/pypen/data_structures/generators/generators1.py
processing time (with generators) 0.028033358176432314
processing time (with iterators) 0.02699498330810426
在上面的程序中,我试图测量使用 iterators
和使用 generators
打开读取大文件所花费的时间。该文件可用 here。使用迭代器读取文件的时间比使用生成器读取文件的时间要短得多。
我假设如果我要测量函数 process_file_1
和 process_file_2
使用的内存量,那么生成器的性能将优于迭代器。有没有办法测量 python.
首先,使用代码的单次迭代来衡量其性能并不是一个好主意。由于系统性能的任何故障(例如:后台进程、cpu 进行垃圾收集等),您的结果可能会有所不同。您应该检查它是否有相同代码的多次迭代。
为了衡量代码的性能,使用timeit
模块:
This module provides a simple way to time small bits of Python code. It has both a Command-Line Interface as well as a callable one. It avoids a number of common traps for measuring execution times.
要检查代码的内存消耗,请使用Memory Profiler
:
This is a python module for monitoring memory consumption of a process as well as line-by-line analysis of memory consumption for python programs.