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

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

08.06.2020, 00:19. Показов 2442. Ответов 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
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru