Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 39

Как ускорить код? Numba?

08.06.2020, 00:19. Показов 2514. Ответов 28

Студворк — интернет-сервис помощи студентам
Подскажите как можно ускорить код? TXT файлы весят 20MB, python долго считывает их.

Пытался через библиотеку ‘Numba’, но слишком много действий для jit'a и выполнение завершается.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import random
from numba import njit, cuda 
 
filenames = ['input7.txt', 'input8.txt']
 
def run():
    try:
        while 5 > 1:
            browser = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ' +\
                'AppleWebKit/537.36 (KHTML, like Gecko) ' +\
                'Chrome/71.0.3578.98 Safari/537.36'
            headers = {'User-Agent': browser}
            pageNum1 = random.randrange(1,1000000)
            pageNum2 = random.randrange(1,1000000)
            fullurl = ['http://localhost/'+str(pageNum1),'http://localhost/'+str(pageNum2)]
 
            for url in fullurl:
                html = requests.get(url=url, headers=headers).text
                print (url)
                for filename in filenames:
                    with open(filename) as f:
                        for line in f:
                            if line.rstrip() in html:
                                print(f'Find "{line}" on the page {url}')
                                with open('find.txt', 'a') as appendFile:
                                    appendFile.write('{}\n'.format(url))
                                    appendFile.write('{}\n'.format(line))
                                return
                                
    except (ValueError):
        print ("Break")
        
run()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.06.2020, 00:19
Ответы с готовыми решениями:

Как ускорить код?
Как ускорить мой код? def Authors(what, lang='en'): with warnings.catch_warnings(): warnings.simplefilter("ignore"); params =...

Как ускорить код
def a(n): if n==1: return 1 else: return 1+a(n-a(a(n-1))) n=int(input()) print(a(n))

Как ускорить код
import random import string while True: words = random.randrange(12, 26) result_str =...

28
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 39
10.06.2020, 00:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от outoftime Посмотреть сообщение
Правда? Ну ладно, раз вы всё сами знаете, тогда сами и решите свою проблему. Удачи!
Ну что вы, это мое предположение было. Мои знания далеки от ваших, просто хочу разобраться. И прошу профессионалов, вроде вас, помочь мне в этом вопросе.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.06.2020, 00:38
Сколько у тебя файлов?
Что ты ищешь в каждом html?
Не проще извлечь нужную часть html (как часть какого-то элемента страницы) с помощью XPATH или селекторов CSS (это называется html парсинг - lxml\bs4) и уже не тупо по строчкам этого html итерировать и проверять наличие этого нечто в файлах, а искать что-то конкретное в файлах? Искать тогда можно будет уже не линейным поиском, а регулярным выражением.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.06.2020, 00:45
Цитата Сообщение от Garry Galler Посмотреть сообщение
Искать тогда можно будет уже не линейным поиском
у этого линейного поиска сложность O(N*M) где N и M - длины текста и искомой строки соответсвенно.
0
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 39
10.06.2020, 11:43  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Сколько у тебя файлов?
Что ты ищешь в каждом html?
2 файла с артикулами в каждой строке, типа 554433q1. В html база тех самых артикулов из 1С.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.06.2020, 13:51
Цитата Сообщение от jerrym Посмотреть сообщение
В html база тех самых артикулов из 1С.
В каком виде эта база?
И что ты хочешь проверить? Вхождение первого попавшегося\любого артикула из файла в конкретный html и затем записать его url и этот первый попавшийся артикул? (так следует из твоего первого кода, только вместо return должен быть break). Почему тебя интересен любой артикул?
В этом случае можно все артикулы засунуть в set и проверять set([артикулы_из_файла\файлов]) & set([артикулы_из_конкретного_html]) - ровно одна операция на каждый url. Если результат не пустой set(), значит есть пересечение.

Или ты хочешь все-таки декартово произведение и сравнивать каждый с каждым?

return в твоем коде завершает не цикл, а всю функцию run целиком.

break делает выход из ближайшего цикла. Для досрочного выхода из вышележащих циклов уже не обойтись без условий с флагами, так как в Python нет меток циклов.
try except неправильно делать на весь код. Он должен быть как выстрел снайпера - ровно на одну операцию, которая может вызвать исключение, которое ты не можешь проверить и исключить.
В данном случае это запрос на сервер. И у каждого исключения есть имя, поэтому ловить нужно не любое исключение, а конкретное. Если базовых исключений на операцию может быть несколько, писать под каждое свой блок except.
И только в самом последнем блоке except можно написать except Exception для отлова всех прочих исключений.
2
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 39
10.06.2020, 21:55  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
В этом случае можно все артикулы засунуть в set и проверять
Благодарю, это увеличило скорость в несколько раз! Хоть всё у меня и коряво, но работает. Не пойму только как записать это пересечение и страницу в find.txt отдельно от цикла.

Цитата Сообщение от Garry Galler Посмотреть сообщение
В каком виде эта база?
html страница с блоками текста (те самые артикулы) и датами. Пример артикула - a188905881Uop


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests
import random
import re
 
filenames = ['input.txt']
 
lines = []
 
for filename in filenames:
    with open(filename) as f:
        for line in f:
            lines.append(line.rstrip())
 
 
def run():
    try:
        while 5 > 1:
            browser = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ' +\
                'AppleWebKit/537.36 (KHTML, like Gecko) ' +\
                'Chrome/71.0.3578.98 Safari/537.36'
            headers = {'User-Agent': browser}
            pageNum = random.randrange(1,1000000)
 
            fullurl = ['http://localhost/'+str(pageNum)]
            for url in fullurl:
                html = requests.get(url=url, headers=headers).text
                print (url)
                result = re.findall(r'\ba\w+', html)
                result = set(result)
            if (set(lines) & set(result)):
                print(f'Find {url}')
                with open('find.txt', 'a') as appendFile:
                    appendFile.write('{}\n'.format(url))
 
                break
    except (ValueError):
        print ("Break")
        
run()
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.06.2020, 22:44
Хотя бы вот к такому варианту свой код приведите...
Не нужно делать в цикле то, что должно быть вне цикла.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
browser = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ' +\
                'AppleWebKit/537.36 (KHTML, like Gecko) ' +\
                'Chrome/71.0.3578.98 Safari/537.36'
 
headers = {'User-Agent': browser}
pattern = re.compile(r'\ba\w+')
 
 
def run():
    appendFile = open('find.txt', 'a')
    while True:
        pageNum = random.randrange(1,1000000)
        'http://localhost/' + str(pageNum)
        fullurl = "".join(['http://localhost/',str(pageNum)])
        
        try:
            resp = requests.get(url=url, headers=headers)
        except Exception as err:
            print(err, url)
            break
        else:
            if resp.status_code ==  200:
                result = pattern.findall(resp.text)
                result = set(result)
                if set(lines) & set(result):
                    print(f'Find {url}')
                    appendFile.write('{}\n'.format(url))
            else:
                print(resp.status_code, url)
                
            
    appendFile.close()            
    
 
 
if __name__ == "__main__":
    
    run()
Как там ты будешь бесконечный цикл прерывать, я не в курсе. Обычно для этого используют события или условия.
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.06.2020, 22:46
Цитата Сообщение от jerrym Посмотреть сообщение
как записать это пересечение и страницу в find.txt отдельно от цикла
Как ускорить код? Numba?
1
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 39
11.06.2020, 11:30  [ТС]
Garry Galler, outoftime, спасибо вам, все работает намного быстрей!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.06.2020, 11:30

Как ускорить код?
Здравствуйте, имею код, выдает ответ правильно, но не проходит по времени в тестирующей системе. Как мне его изменить, чтобы код стал...

Можно как-то ускорить код?
a =input().split() d = f = 0 d=input().split() for w in range(int(a)): z=input().split() k=int(z) while...

Как ускорить данный код на Python?
from sys import setrecursionlimit n=int(input()) result=0 setrecursionlimit(1000) def count(n,k=1): if n==0: global...

Как ускорить код для задачи про забор?
Здравствуйте. Помогите исправить код. Задача такая. Друзья Т.Сойера красят забор. Каждый красит неcколько подряд идущих досок, при...

Ускорить асинхронный код
Записываю строки в таблицу так from sqlalchemy import insert import config import Table import asyncio from aiopg.sa import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru