python timeit测量代码运行时间, 好像不对
PHPz
PHPz 2017-04-18 09:04:07
0
2
345
def is_unique_char(string):
    if len(string) > 256:
        return True

    record = 0L

    for ch in string:
        # print record
        ch_val = ord(ch)

        if (record & (1 << ch_val)) > 0:
            return False

        record |= (1 << ch_val)

    return True


import string
s1 = string.ascii_letters + string.digits


if __name__ == '__main__':
    import timeit
    print is_unique_char(s1)
    print timeit.timeit("is_unique_char(s1)",
            setup="from __main__ import is_unique_char, s1")
            

代码如上, is_unique_char 就是一个包含位运算的函数(具体作用不重要)
运行代码, 秒出print is_unique_char(s1)的结果, 但是timeit测量需要30多秒。 这是为什么呢?会不会是因为位运算? 呃,先感谢大家解答

PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
Ty80

Pour faire simple, timeit exécutera le code 1000000 fois..., ce qui bien sûr prend beaucoup de temps.

Cette fonction est utilisée pour mesurer le temps d'exécution moyen d'un certain morceau de code, vous devez donc le diviser par le nombre de fois où il est exécuté.

J'ai modifié votre code et je l'ai testé en utilisant time.time :

# uc.py

chaîne d'importation

def is_unique_char(chaîne) :
    si len(chaîne) > 256 :
        retourner vrai

    enregistrement=0L

    pour ch dans la chaîne :
        # imprimer l'enregistrement
        ch_val = ord(ch)

        si (enregistrement & (1 << ch_val)) >
            retourner Faux

        enregistrement |= (1 << ch_val)

    retourner vrai

s1 = string.ascii_letters + string.digits
importer le temps
heure d'importation
depuis uc import is_unique_char, s1

si __name__ == '__main__' :
    btime = time.time()
    est_unique_char(s1)
    etime = time.time()
    imprimer etime-btime
    print timeit.timeit("is_unique_char(s1)", setup="from uc import is_unique_char, s1")/1000000

Résultat :

4.91142272949e-05 2.89517600536e-05

Le résultat est qu'une seule exécution est presque la même...


Questions auxquelles j'ai répondu : Python-QA

黄舟

https://docs.python.org/2/library/timeit.html

timeit.timeit(stmt='pass', setup='pass', timer=<minuterie par défaut>, number=1000000)

Créez une instance Timer avec l'instruction donnée, le code de configuration et la fonction timer et exécutez sa méthode timeit() avec nombre d'exécutions

nombre d'exécutions
默认number=1000000
默认要跑1000000次当然慢了...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal