[英]Python timeit function crashing with NameError: global name does not exist
我試圖在python2.7中對兩個可比較的語句進行基准測試。
一個語句打印從內存中檢索到的數字列表。 另一個語句打印從相同服務器上維護的redis列表中檢索到的相同編號的列表。
例如
pylist1 = [1,2,3,4,5]
pylist2 = my_server.lrange("nums:5",0,-1) #where nums:5 = [1,2,3,4,5]
如何使用timeit來對print pylist1
和print pylist2
進行基准測試?
我正在python shell中嘗試以下操作:
import timeit
import redis
POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
my_server = redis.Redis(connection_pool=POOL)
pylist1 = [1,2,3,4,5]
pylist2 = my_server.lrange("nums:5",0,-1)
print min(timeit.Timer('print pylist1').repeat(7,1000))
這只是崩潰與NameError: global name 'pylist1' does not exist
。 這很奇怪,因為print pylist1
可以完美工作! 在做我打算正確做的事情時需要幫助。
Timer
的文檔說:
用於計時小代碼段的執行速度的類。
構造函數接受一條要計時的語句,一條用於設置的附加語句以及一個計時器函數。 這兩個語句默認為'pass'; 計時器功能取決於平台(請參閱模塊文檔字符串)。 如果指定了'globals',則代碼將在該名稱空間內執行(與timetime內部的名稱空間相對)。
[...]
這告訴您,默認情況下,由Timer
執行的語句是在其自己的名稱空間中執行的,該名稱空間無法訪問外部名稱空間,也無法對其進行修改。 要更改此設置,可以使用setup語句導入所需的名稱:
Timer(..., setup='from __main__ import pylist1')
或僅指定使用當前名稱空間執行代碼:
Timer(..., globals=globals())
請注意,如果您要計時的語句修改了變量,則它們實際上將在模塊中更改。 最好使用globals
的副本:
Timer(...., globals=globals().copy())
# even better
import copy
Timer(..., globals={'pylist1': copy.deepcopy(pylist1))
在此情況下,正在分析的代碼不會修改您的全局變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.