Python:如何测试IF语句到Dictionary Case语句的效率?

2024-10-02 14:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中测试IF语句到dictionary case语句的效率。因为没有case语句,所以我现在使用dictionary方法。看起来是这样。。。。你知道吗

    self.options = {"0": self.racerOne,
        "1": self.racerTwo,
        "2": self.racerThree,
        "3": self.racerFour,
        "0f": self.racerFinish,
        "1f": self.racerFinish,
        "2f": self.racerFinish,
        "3f": self.racerFinish,
        "x": self.emptyLine,
        "t": self.raceTime,
        "G": self.letsGo,
        "CD": self.countDown,
        "C": self.emptyLine,
        }

真实世界的数据会有所不同,但我有一种方法可以运行一个控制测试,在6.4秒内读取688行流数据。
我也读过这篇文章:Python Dictionary vs If Statement Speed我还要检查cProfile方法。你知道吗

与dictionary选项相比,有没有人对如何准确地度量IF语句有其他建议?通过高效,我猜这意味着使用最少的处理能力,可以更好地跟上流。你知道吗

在这6.4秒内,我读取每一行流数据,对其进行解析、评估,然后实时直观地显示出来。我不认为在Win或OSX系统上运行我的应用程序会有什么不同,但它也必须在处理能力有限的Raspberry Pi上运行。你知道吗

提前谢谢。你知道吗


Tags: 数据方法selfdictionaryif能力语句options
1条回答
网友
1楼 · 发布于 2024-10-02 14:18:23

听起来好像你要优化的主要领域不是这句话。你知道吗

不过,出于好奇,我还是检查了一下。直观的答案是python字典是作为哈希表实现的,这一点在您所链接的问题中给出。查找应按项目数在O(1)左右缩放。如果你所展示的语句将按O(n)缩放,因为每个语句都将按顺序执行。通过使用每个函数运行1000个随机数,每个函数有2到1000个选项,我得到以下计时结果(y刻度是每个选项的秒数,是对数刻度)。如果链是蓝色的,dict lookup是绿色的。x刻度有许多可能的选择:

enter image description here

可以看出,查找是,并且比长if语句链快得多。你知道吗

即使是短链,在这段代码中,查找速度仍然更快,或者大致相同:

enter image description here

但请注意这里的时间。我们讨论的是我电脑上每个选项的时间在亚微秒范围内:对于较少的选项,大约为600ns。在这一点上,开销可能来自简单的函数调用。另一方面,如果你有很多可能的选择,最好的选择应该非常清楚。你知道吗

上面的代码如下。它使用numpy来记录所有的时间。对于这种简单的计时问题,通常最容易使用时间。时间()在你想做的事情之前和之后得到一个时间值。对于一些非常快的事情,你需要循环多次并取平均次数。你知道吗

我应该补充一点,我创建if语句链的方式有点邪恶。在这样做时(使用exec语句),函数可能没有以同样的方式优化:我不是python内部结构的专家。你知道吗

import numpy as np
import time
def createdictfun(n):
    optdict = { x: 2*x for x in range(0,n) }
    def dictfun(x):
        return optdict[x]
    return dictfun

def createiffun(n):
    s="def iffun(x):\n"
    s+="  if x==0: return 0\n"
    for i in range(1,n):
        s+="  elif x=={}: return {}\n".format(i,i*2)
    s+="  else: raise ValueError\n"
    exec s
    return iffun
ntry=10
maxchoice=1000
trialsize=1000
ifvals=np.zeros((maxchoice,2))
dictvals=np.zeros((maxchoice,2))
ns=np.arange(1,maxchoice)
for n in ns:
    ift = np.zeros(ntry)
    dictt = np.zeros(ntry)
    vals=np.random.randint(0,n,size=trialsize)
    iffun = createiffun(n)
    dictfun = createdictfun(n)
    for trial in range(0,ntry):
        ts=time.time()
        for x in vals:
            iffun(x)
        ift[trial]=time.time()-ts
        ts=time.time()
        for x in vals:
            dictfun(x)
        dictt[trial]=time.time()-ts
    ifvals[n,0]=np.mean(ift)/trialsize
    ifvals[n,1]=np.std(ift)/trialsize
    dictvals[n,0]=np.mean(dictt)/trialsize
    dictvals[n,1]=np.std(dictt)/trialsize
    print str(n)+" ",

相关问题 更多 >