를 실행합니다
exec(str1 + '=1')
를, 어느 코드를 읽을 수있는 다음 사람은 것이다. 의미하는 경우
b = 1
이렇게 말해야합니다. 이 경우 vars()
에서 코드가 b
이 a
에 로컬하고 a
를 종료에 따라 범위를 벗어나면 증발
def a():
b = 1
에 해당합니다 있도록 함수 지역 사전에 액세스 할 수 있습니다.
조기 최적화 산출 파이썬
from itertools import izip
import timeit
import msw.wordlist
def zip_list(p):
"""construct a dictionary of length 100 from a list of strings"""
return dict(zip(p[:100], p[100:]))
def izip_list(p):
"""as zip_list but avoids creating a new list to feed to dict()"""
return dict(izip(p[:100], p[100:]))
def pass_list(p):
"""take 100 elements of a list and do nothing"""
for i in p[:100]:
pass
def exec_pass_list(p):
"""exec() a no-op 100 times"""
for i in xrange(100):
exec('pass')
# returns a list of 64'000 unique lowercase dictionary words for tests
words = msw.wordlist.Wordlist()
words.shuffle()
words = words[:200]
print 'words', words[:5], '...'
for func in ['zip_list', 'izip_list', 'pass_list', 'exec_pass_list']:
t = timeit.Timer('%s(words)' % func,
'from __main__ import words, %s' % func)
print func, t.repeat(number=10**5)
을 두 번째 추측 많은 사람들의 시도의 루트입니다 :
words ['concatenated', 'predicament', 'shtick', 'imagine', 'stationing'] ...
zip_list [1.8603439331054688, 1.8597819805145264, 1.8571949005126953]
izip_list [1.5500969886779785, 1.5501470565795898, 1.5536530017852783]
pass_list [0.26778006553649902, 0.26837801933288574, 0.26767921447753906]
exec_pass_list [74.459679126739502, 75.221366882324219, 77.538936853408813]
나는 OP가하려고했던대로 구현하려고 귀찮게하지 않았다 왜냐하면 사전 정렬을 구성하지 않는 것이 50 배 더 느리기 때문에 추가 테스트가 다소 어리 석다.
출처
2010-07-15 16:32:03
msw
[파이썬 vars() 전역 이름 오류] 가능한 중복 (http://stackoverflow.com/questions/2226386/python-vars-global-name-error) – Thomas