Maison  >  Questions et réponses  >  le corps du texte

性能 - python 的in 和 find 执行效率问题

PHP中文网PHP中文网2763 Il y a quelques jours733

répondre à tous(3)je répondrai

  • 高洛峰

    高洛峰2017-04-18 09:24:21

    J'ai modifié ton code donc ça devrait être plus simple :

    (Je l'ai modifié en fonction de la suggestion de @evian)

    import os
    import sys
    
    def getinfo(filename) :
        info = {}
        with open(filename, 'r') as f:
            for line in f:
                ID, name = line.strip().split()
                info[ID] = name
        return info
    
    
    def matchname(info, input_file, output_file) : 
        with open(input_file, 'r') as reader, open(output_file, 'w') as writer:
            for line in reader:
                n1, n2, content = line.strip().split()
                for ID, name in info.items():
                    if name in content:
                        print(n1, n2, name, ID, sep='\t', file=writer)
    
    
    if __name__ == '__main__':
        info_filename = 'aa.txt'
        content_filename = 'bb.txt'
        result_filename = 'final_output2.txt'
        info = getinfo(info_filename)
        matchname(info, content_filename, result_filename)
        print('done')

    (Reviendrez plus tard pour expliquer...)


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

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:24:21

    in est certainement plus rapide que find car le premier nécessite moins de recherches d'attributs, d'appels de fonctions et plus d'opérations de comparaison que le second :

    >>> def t():
    ...   return "abctestdef".find("testx")
    ... 
    >>> import dis
    >>> dis.dis(t)
      2           0 LOAD_CONST               1 ('abctestdef')
                  3 LOAD_ATTR                0 (find)
                  6 LOAD_CONST               2 ('testx')
                  9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
                 12 RETURN_VALUE
    >>> def t():
    ...   return "test" in "abctestdef"
    ... 
    >>> dis.dis(t)
      2           0 LOAD_CONST               1 ('test')
                  3 LOAD_CONST               2 ('abctestdef')
                  6 COMPARE_OP               6 (in)
                  9 RETURN_VALUE

    Si vous souhaitez aller plus vite, pensez à utiliser Rust :-)

    De plus, votre code n'est pas très bien écrit. Il est recommandé d'utiliser with au lieu de fermer manuellement pour les opérations sur les fichiers.

    répondre
    0
  • PHPz

    PHPz2017-04-18 09:24:21

    La complexité temporelle de l'ensemble est O(1)
    La complexité temporelle de la liste est O(n)

    Vous pouvez essayer d'utiliser des ensembles lors de l'assemblage

    répondre
    0
  • Annulerrépondre