Насколько эффективен мой поисковый код Python - PullRequest
1 голос
/ 17 ноября 2011

Ниже приведены подробные сведения о моем приложении для поиска файлов Python.Я все еще новичок в Python, и мне больше нравится получать рабочий код, чем думать об эффективности и производительности.Я хочу знать от вас, Python или любой другой язык, ветераны, есть ли что-нибудь, что я могу сделать, чтобы сделать мой код более эффективным, тем самым быстрее?Я где-то читал о профилировании скрипта, но я не очень знаком с концепцией и не уверен, применима ли она.В настоящее время мой код занимает около 4-5 минут для поиска по 100 файлам (самый большой файл ~ 5000 КБ).Это довольно медленно.

Код:

 userstring = raw_input("Enter a search string!")
 ...
 ...
 ...
 if userstring:
        userStrHEX = userstring.encode('hex')
        userStrASCII = ''.join(str(ord(char)) for char in userstring)
        regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape(userStrHEX ), re.escape( userStrASCII )))      
 else:
    sys.exit('You Must Enter A String!!!')

    count = 0
    count2 = 0
    for afile in filelist:
        (head, filename) = os.path.split(afile)
        if afile.endswith(".log") or afile.endswith(".txt"):
            count2 += 1
            self.progress_bar.Show()
            self.progress_bar.SetRange(numFiles)
            wx.CallAfter(self.progress_bar.SetValue, count2)
            f=ftp.open(afile, 'r')
            for i, line in enumerate(f.readlines()):
                result = regex.search(line)
                if self.shouldAbort:
                    return self.shouldAbort
                    break

                if result:
                    count += 1
                    ln = str(i)
                    pathname = os.path.join(afile)
                    template = "\n\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
                    output = template.format(ln, pathname, result.group())
                    ftp.get(afile, 'c:\\Extracted\\' + filename)
                    temp.write(output)
                    break
            else:
                temp.write("\nNo Match in: " + os.path.join(afile))

1 Ответ

1 голос
/ 17 ноября 2011

Это очень разумное решение.

Можно сделать это быстрее, используя больше магии регулярных выражений, но вы потеряете некоторую ясность.

Имейте в виду, что время выполнения, скорее всего, определяется поиском файла FTP, а не самим поиском. Таким образом, дополнительная оптимизация процесса IO * , скорее всего, будет потрачена впустую. См. Закон Амдала .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...