<blockquote>
<p><strong>I would like to use timeit.timeit with variables that are within the scope it is in.</strong></p>
</blockquote>
<p><strong>TLDR:</strong></p>
<p>使用一个<code>lambda</code>闭包(之所以这样叫是因为它在函数中的变量上关闭):</p>
<pre><code>def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit(lambda: s1 == s2)
</code></pre>
<p>我想这正是你想要的。</p>
<pre><code>>>> func()
0.12512516975402832
</code></pre>
<p><strong>说明</strong></p>
<p>所以在全局范围内,你想使用全局范围,和局部范围,局部范围?在全局作用域上,<code>locals()</code>返回与<code>globals()</code>相同的结果,因此您可以<code>', '.join(locals())</code>并将其粘贴到<code>'from __main__ import '</code>的末尾,或者<code>globals()</code>因为它们在全局作用域上是等价的:</p>
<pre><code>>>> s1 = 'abc'
>>> s2 = 'abc'
>>> timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(globals()))
0.14271061390928885
</code></pre>
<p>您可以使用函数和<code>globals()</code>来完成此操作,但不能使用locals():</p>
<pre><code>s1 = 'abc'
s2 = 'abc'
def func():
return timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(globals()))
</code></pre>
<p>以及</p>
<pre><code>>>> func()
0.14236921612231157
</code></pre>
<p>但是下面的方法不起作用,因为您必须从import语句访问隐藏在函数的本地范围中的变量:</p>
<pre><code>def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(locals()))
</code></pre>
<p>但是,因为您可以简单地将函数传递给timeit,所以<em>可以</em>做的是:</p>
<pre><code>def func(s1='abc', s2='abc'):
s1 == s2
</code></pre>
<p>以及</p>
<pre><code>>>> timeit.timeit(func)
0.14399981498718262
</code></pre>
<p>这也意味着,在func中,可以为timeit提供lambda闭包:</p>
<pre><code>def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit(lambda: s1 == s2)
</code></pre>
<p>或全功能定义:</p>
<pre><code>def func():
s1 = 'abc'
s2 = 'abc'
def closure():
return s1 == s2
return timeit.timeit(closure)
</code></pre>
<p>我想这正是你想要的。</p>
<pre><code>>>> func()
0.12512516975402832
</code></pre>
<blockquote>
<p><strong>When they're both not in the main program</strong></p>
</blockquote>
<p>如果要从<code>__main__</code>以外的其他模块加入全局变量,请使用以下命令:</p>
<pre><code>'from ' + __name__ + ' import ' + ', '.join(globals())
</code></pre>