JRazor
@JRazor
Senior StarkOverFlow Programmer

Перебор в Python: есть ли способ ускорить?

Нужно организовать перебор в Python, но при проверке большого количества информации он выполняется слишком долго.

Пример: нужно фильтровать все сайты, которые содержат точку и расширение файла из списка.

sites_list = ["http://google.com",
              "http://www.yandex.com",
              "http://rambler.com/ololo.jpg",
              "http://ya.ru/a.bmp"]

format_files = ['jpg', 'bmp', 'jpeg']

print list(filter(lambda url: not any('.' + format_file in url for format_file in format_files),  sites_list))


Но представим, что список сайтов состоит из более чем 200к элементов. Как ускорить процесс?
  • Вопрос задан
  • 4731 просмотр
Решения вопроса 2
@throughtheether
human after all
Пример: нужно фильтровать все сайты, которые содержат точку и расширение файла из списка.
Я не знаю, что означает "сайты, которые содержат точку". Если вам нужно среди всех URL исключить те, которые указывают на файл с определенным расширением, то я бы на вашем месте воспользовался строковым методом endswith:
import timeit
setup_code="""
sites_list = ["http://google.com",
              "http://www.yandex.com",
              "http://rambler.com/ololo.jpg",
              "http://ya.ru/a.bmp"]

format_files = ['jpg', 'bmp', 'jpeg']
"""
print timeit.timeit("x=list(filter(lambda url: not any('.' + format_file in url for format_file in format_files),  sites_list))",setup=setup_code,number=100000)
print timeit.timeit("x=list(url for url in sites_list if not url.endswith(tuple(format_files)))",setup=setup_code,number=100000)

Результаты:
1.01494306967
0.616600117219

Кроме того, я бы заменил, где это возможно, списки (list) на кортежи (tuple) или множества (set).
Ответ написан
@leclecovich
1 У Вас явный оверхед в
list(filter(lambda url: not any('.' + format_file in url for format_file in format_files), sites_list))
Можно сделать проще и, самое главное, быстрее.
2 Кортежи и словари итерируются в общем случае быстрее, чем списки.
3 Если этого мало - поделите исходный список на несколько частей, распараллельте вычисления.
4 Используйте C. Если Вам не нравиться использование массива - C++, STL, Boost Вам в помощь. Помните, о том, что нативный код легко можно вызвать из питона (CPython).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
1kachan
@1kachan
используйте pypy.org
Ответ написан
@4yBa4oK
попробуйте регулярные выражения
аж интересно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы