1

作为我的一个宠物项目的一部分,我需要在 Python 中测试我的代码的各种不同实现的性能。我预计这将是我经常做的事情,并且我想尝试使我为实现此目标而编写的代码尽可能易于更新和修改。

它目前仍处于起步阶段,但我已经开始使用字符串来管理常见的设置或测试代码,例如:

naiveSetup = 'from PerformanceTests.Vectors import NaiveVector\n' \
+ 'left = NaiveVector([1,0,0])\n' \
+ 'right = NaiveVector([0,1,0])'

这允许我只编写一次代码,代价是使其更难阅读和更新笨拙。

有没有更好的办法?

4

2 回答 2

3

使用三引号 """

setup_code = """
  from PerformanceTests.Vectors import NaiveVector
  left = NaiveVector([1,0,0])
  right = NaiveVector([0,1,0])
"""

文档中提供了另一种有趣的方法timeit

def test():
    "Stupid test function"
    L = []
    for i in range(100):
        L.append(i)

if __name__=='__main__':
    from timeit import Timer
    t = Timer("test()", "from __main__ import test")
    print t.timeit()

虽然这并不适合所有需求。

于 2010-01-01T07:42:38.903 回答
0

时序代码很好,但它仍然会让你猜测发生了什么。

要找出实际发生的情况,请在调试器中手动将其暂停几次,然后检查调用堆栈。

例如,在一个实现中比在另一个实现中慢 30 倍的代码中,堆栈的每个样本都有 96.7% 的机会落在它所花费的额外时间中,因此您可以了解原因。

无需猜测。

于 2010-01-01T16:45:12.653 回答