【发布时间】:2022-10-01 09:16:05
【问题描述】:
在 python 3.9 下使用traitlets.Int() 和traitlets.Unicode() 对性能有何影响?
标签: python performance python-traitlets
在 python 3.9 下使用traitlets.Int() 和traitlets.Unicode() 对性能有何影响?
标签: python performance python-traitlets
traitlets.Int() 和 traitlets.Unicode() 的性能比 Python 3.9.14 标准库慢了大约 25 倍。
$ python -V
Python 3.9.14
$
$ uname -a
Darwin WS-T604GF3GK0.tld 21.6.0 Darwin Kernel Version 21.6.0: Wed Aug 10 14:28:23 PDT 2022; root:xnu-8020.141.5~2/RELEASE_ARM64_T6000 x86_64
$
$ python traitlets_test.py
After traitlets initialization, traitlets Unicode() was 24.0261 times slower than python stdlib
After traitlets initialization, traitlets Int() was 26.2789 times slower than python stdlib
$
如果有人想看看我曾经测试过的东西,这就是脚本......
# filename: traitlets_test.py
from timeit import timeit
import sys
from traitlets import HasTraits, Int, Unicode
###############################################
# Define traitlets tests here
###############################################
class MyTraitTester(HasTraits):
"""
Initialize a HasTraits() class instance and define static
types for foo_int and foo_unicode.
"""
foo_int = Int()
foo_unicode = Unicode()
def with_traits_int():
harness.foo_int = 5
return harness.foo_int
def with_traits_unicode():
harness.foo_unicode = "5555555555555555555555555555555555555555555555555555"
return harness.foo_unicode
###############################################
# Define python stdlib tests here...
###############################################
def without_traits_int():
foo_int = 5
return foo_int
def without_traits_unicode():
foo_unicode = "5555555555555555555555555555555555555555555555555555"
return foo_unicode
if __name__=="__main__":
# Initialize traitlets here... `traitlets.HasTraits()` looks very slow... I will not test performance with it.
harness = MyTraitTester()
time_with_traits = timeit("with_traits_unicode()", setup="from __main__ import with_traits_unicode", number=1000000)
time_without_traits = timeit("without_traits_unicode()", setup="from __main__ import without_traits_unicode", number=1000000)
print("After traitlets initialization, traitlets Unicode() was {} times slower than python stdlib".format(round(time_with_traits/time_without_traits, 4)))
time_with_traits = timeit("with_traits_int()", setup="from __main__ import with_traits_int", number=1000000)
time_without_traits = timeit("without_traits_int()", setup="from __main__ import without_traits_int", number=1000000)
print("After traitlets initialization, traitlets Int() was {} times slower than python stdlib".format(round(time_with_traits/time_without_traits, 4)))
【讨论】: