簡體   English   中英

Python timeit函數因NameError崩潰:全局名稱不存在

[英]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 pylist1print 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM