Đây là một sự tối ưu hóa vi mô khá tệ, nhưng tôi chỉ tò mò. Nó thường không tạo nên sự khác biệt trong thế giới "thực".Tại sao cuộc gọi hàm trống trong python chậm hơn khoảng 15% đối với mã python được biên dịch động
Vì vậy, tôi đang biên soạn một hàm (không có gì) bằng cách sử dụng compile()
rồi gọi exec
trên mã đó và nhận tham chiếu đến hàm tôi đã biên dịch. Sau đó, tôi thực hiện nó một vài triệu lần và định thời gian. Sau đó lặp lại nó với một hàm cục bộ. Tại sao chức năng tự động biên dịch chậm hơn khoảng 15% (trên trăn 2.7.2) chỉ cho cuộc gọi?
import datetime
def getCompiledFunc():
cc = compile("def aa():pass", '<string>', 'exec')
dd = {}
exec cc in dd
return dd.get('aa')
compiledFunc = getCompiledFunc()
def localFunc():pass
def testCall(f):
st = datetime.datetime.now()
for x in xrange(10000000): f()
et = datetime.datetime.now()
return (et-st).total_seconds()
for x in xrange(10):
lt = testCall(localFunc)
ct = testCall(compiledFunc)
print "%s %s %s%% slower" % (lt, ct, int(100.0*(ct-lt)/lt))
Kết quả tôi nhận được là một cái gì đó như:
1.139 1.319 15% slower
chuyển ngữ cảnh? I E. khi bạn gọi hàm được biên dịch, bạn vẫn đang đi vào một phạm vi mới, thực hiện hàm và trả về kết quả từ phạm vi? (Tôi không phải là chuyên gia về python, chỉ cần đoán) –
Các phép đo của bạn bị tắt. Sử dụng 'timeit' để lấy các số đo không thiên vị, và kết quả sẽ giống nhau (tôi đã thử, chúng là). Hai đối tượng hàm không thể phân biệt được và chúng có mã byte giống nhau. –
@SvenMarnach Trả lời với microbenchmark truy cập? –