用于测量代码执行时间的python模块

exectiming的Python项目详细描述


执行计时

< Buff行情>

python的一个高级计时器,它使确定执行时间变得容易。

python有一个名为timeit的内置包,它提供了 "测量小代码段的执行时间。"它可以很快 测试,但缺乏更广泛的特征,如曲线拟合、统计信息, 以及在现有项目中使用的能力。exectiming试图通过 包括timeit的大部分特性,以及添加更多类似于decorator的特性, 参数调用和替换,最佳拟合曲线的确定,以及在项目中的使用。

imgur image

功能

  • statictimer它提供了通过decorator计时函数的能力, 字符串,或者只是查看调用之间经过的时间量。start_elapsed()elapsed()
  • 计时器提供了记录测量时间并显示统计数据的方法, 对参数为自变量的函数进行曲线拟合 作为因变量的测量时间,以及StaticTimer的所有功能。
  • 所有输出都可以通过更改output_stream重新定向,可以是任何 类似文件的对象或任何具有.write()方法的对象。
  • 包含一个用于logging.infologging.debug的包装器,用于重定向 输出到这些源
  • 测量时间可显示为秒s,毫秒ms, 微秒us,或纳秒ns
  • 同一个块可以多次执行以获得更精确的读数。 这是通过设置每次运行的迭代次数来完成的。在多次迭代之后, 测量经过的时间。
  • 可以执行多次运行并取其平均值,以删除外围结果。

维基

词汇表

安装

pip install exectiming

完整功能:

  • scipy-最佳拟合曲线
  • scikit learn-最佳拟合曲线
  • numpy-最佳拟合曲线
  • matplotlib-用于绘图

但是,即使找不到这些依赖项,基本功能仍将存在

静态装饰

fromexectiming.exectimingimportStaticTimerfromrandomimportrandint@StaticTimer.decorate(runs=5,average_runs=False,call_callable_args=True,log_arguments=True)deffactorial(n):ifn==1:return1else:returnn*factorial.__wrapped__(n-1)factorial(lambda:randint(3,40))#    0.01663 ms - factorial(33) ... [runs=  1, iterations=  1] | Run 1#    0.00544 ms - factorial(19) ... [runs=  1, iterations=  1] | Run 2#    0.00736 ms - factorial(28) ... [runs=  1, iterations=  1] | Run 3#    0.00448 ms - factorial(17) ... [runs=  1, iterations=  1] | Run 4#    0.01087 ms - factorial(38) ... [runs=  1, iterations=  1] | Run 5
  • 函数,甚至是递归函数,都可以被包装起来,以便在调用它们的任何时候都能得到计时
  • 您可以用可以自动调用和替换参数的函数替换参数 要允许如上所示的测试,call_callable_args=true
  • 参数显示在输出中以提供更多信息,logu arguments=true

静态时间
fromexectiming.exectimingimportStaticTimerStaticTimer.time_it("pow(2, 64)",runs=10,iterations_per_run=10000)#  107.10668 ms - pow(2, 64) ... [runs= 10, iterations=10000]  StaticTimer.time_it("2**64",runs=10,iterations_per_run=10000)#   68.75266 ms - 2**64 ... [runs= 10, iterations=10000] StaticTimer.time_it("1<<64",runs=10,iterations_per_run=10000)#   65.53690 ms - 1<<64 ... [runs= 10, iterations=10000] 
  • 字符串可以计时
  • 可以测量多次运行,然后对其进行平均以获得更精确的结果
  • 通过设置globals=locals=setup=可以传入任何需要的名称。 前两个必须是名称到对象的映射。第二个字符串是 执行一次,因为字符串是定时的。

time\u it可用于重新编写上述示例中的decorator,如下所示:

StaticTimer.time_it(factorial,lambda:randint(3,40),call_callable_args=True,average_runs=False,runs=5,log_arguments=True)

假设

fromexectiming.exectimingimportTimertimer=Timer()

变压器,STATistics和Best Fit
@timer.decorate(runs=5,log_arguments=True,call_callable_args=True)defbubble_sort(array):whileTrue:switched=Falseforiinrange(0,len(array)-1):ifarray[i]>array[i+1]:array[i],array[i+1]=array[i+1],array[i]switched=Trueifnotswitched:breakreturnarraybubble_sort(lambda:[randint(0,1000)for_inrange(randint(100,5000))])timer.output(split_index="bubble_sort",transformers={0:len})# bubble_sort:#     1333.19493 ms - bubble_sort(2141) ... [runs=  1, iterations=  1]                     #     1413.75243 ms - bubble_sort(2546) ... [runs=  1, iterations=  1]                     #     4247.70385 ms - bubble_sort(4530) ... [runs=  1, iterations=  1]                     #       34.01533 ms - bubble_sort(421)  ... [runs=  1, iterations=  1]                     #      675.07202 ms - bubble_sort(1752) ... [runs=  1, iterations=  1]   timer.statistics()# bubble_sort[runs=5, total=7703.73856 ms]:#      Min | Max | Average = 34.01533 | 4247.70385 | 1540.74771 ms#       Standard Deviation = 1442.66797 ms#                 Variance = 2081.29087 msprint(timer.best_fit_curve(transformers=len))# ('Polynomial', {'a': 2.8042911992314363e-07, 'b': -9.670141667209306e-05, 'c': 0.024305228337961525})
  • 计时器存储输出直到请求为止
  • 函数参数可以在输出中转换。在上面的例子中, transformers={0:len}表示索引0的位置参数应该有 用该参数调用函数的结果替换输出中的值。 否则,输出将类似于气泡排序([1,2,3,4,5,…])
  • transformers=len也有效,因为所有参数都可以用len进行转换,所以 无需指定该函数应用于哪个索引/键。
  • 可以显示基本统计信息
  • 可以确定最佳拟合曲线。要使用这个,所有记录的功能参数 必须是整数。在本例中,一个是一个列表,因此它被转换为 分析的是列表的长度,而不是列表本身。
  • 得到的最佳拟合曲线是,如果x=len(list)y=ax^2+bx+c。 我们可以利用这条曲线推断执行时间,以确定它将 对长度x=10000的列表进行排序 0.0000002804*10000^2-0.0000967*10000+0.0243。即27.10 s27100 ms

绘制阶乘

@timer.decorate(runs=100,iterations_per_run=10,call_callable_args=True,log_arguments=True)deffactorial(n):ifn==1:return1else:returnn*factorial.__wrapped__(n-1)factorial(lambda:randint(1,100))timer.plot(plot_curve=True,time_unit=timer.US,equation_rounding=5)

imgur image

  • .plot()提供了一种根据参数绘制测量时间的快速方法 这是自变量
  • 可自动确定和添加最佳拟合曲线和方程 通过设置plot_curve=true

绘制气泡排序

# using bubble_sort from above, just with runs=10bubble_sort(lambda:[randint(0,100)for_inrange(randint(100,2500))])curve=timer.best_fit_curve(transformers=len)timer.plot(transformer=len,plot_curve=True,curve=curve,x_label="List Length")

imgur image

  • 曲线可以预先确定,然后进入plot()
  • plot()需要transformer=len因为独立变量和因变量 必须是整数,因此使用len使其成为一个

绘制二进制搜索

@timer.decorate(runs=100,iterations_per_run=5,log_arguments=True,call_callable_args=True)defbinary_search(sorted_array,element):lower,upper=0,len(sorted_array)middle=upper//2whilemiddle>=lowerandmiddle!=upper:ifelement==sorted_array[middle]:returnmiddleelifelement>sorted_array[middle]:lower=middle+1# lower must be beyond middle because the middle wasn't rightelse:upper=middle-1# upper must be lower than the middle because the middle wasn't rightmiddle=(upper+lower)//2returnNone# couldn't find itbinary_search(lambda:[iforiinrange(randint(0,10000))],lambda:randint(0,10000))timer.plot(plot_curve=True,curve=timer.best_fit_curve(exclude={1},transformers=len),key=0,transformer=len,time_unit=timer.US,x_label="List Length",equation_rounding=4,title="Binary Search - Random Size, Random Element")

imgur image

  • binary_search()接受两个参数,因此将最佳拟合曲线设置为忽略 第二个,在索引1处,使用len
  • 转换索引0处的参数
  • 确定曲线后,必须绘制分割。再说一次,还有 两个参数,因此key=0表示使用第一个作为自变量 transformer=len将把列表转换为整数
  • 此外,还指定了标题和X轴标签,并将舍入设置得更低
  • 曲线图上显示的方程式使用时间单位指定的时间刻度

绘制多个拆分

pip install exectiming
0

imgur image

  • 通过设置 最后一次调用.plot()
  • 将使用上一次调用的标题x_标签,和y_标签

待办事项

  • [X]将参数检查添加到.plot().best_fit_curve()以确保 参数是整数,以避免难以破译的错误
  • [X]更改.best_fit_curve()以允许变压器是可调用的
  • [X]更改.output()。transformers={0:len},则不需要拆分索引。 如果只有一个参数或一个映射,则允许transformers只是一个函数 或者一张地图。
  • [X]更改.sort_runs()以反映值不必是整数, 他们只需要有可比性。如果不是,那么就需要一个变压器。 这种变化主要是化妆品。(bj-无需更改)
  • [X]将。predict(params,arguments)添加到计时器。基本上应该是 将调用传递到正确的最佳拟合曲线上的。calculate_point()
  • [X]将exclude_argsexclude_args折叠成仅exclude的值。 位置参数和关键字参数之间的差异可以确定为 内景vs.str.
  • [X]更改返回系数的方式,可以使用 x索引/键
  • [X]添加上下文管理器
  • [X]使scipy、numpy和scikit学习成为可选,只要禁止最佳拟合曲线如果它们不存在
  • [X]使用matplotlib添加绘图功能,只有在只有一个参数时才会绘制线性图形
  • [X]添加对运行排序的功能,以便它们以某种顺序显示。可能允许排序 按时间或参数计算

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java AnimatedVectorDrawable支持库和“pathData”动画   java Qt Jambi:QistTractListModel未显示在QListView中   单击按钮时清除共享首选项   java线程池大小应该远大于内核数+1   linux编译错误java hadoop程序   java不包括findBugs发现的bug   SpringJava。lang.NoClassDefFoundError:org。阿帕奇。贾斯珀。埃尔。ELContextImpl(初始化失败)   使用AVL树的java字典数组   java如何使用数组数据执行jsoup请求?Jsoup使用数组数据发布请求并从php服务器获取json   java jdbc在sql server 2008 r2上存储的png图像提供了不完整的数据   java坏路径警告,它来自哪里?   java从HashMap<String,ArrayList<String>>   java HttpSolrserver已被弃用,无法让HttpSolrClient毫无例外地工作   java如何使用坐标很少的仿射变换?   java在JaxRs中存储会话对象