Как можно ускорить код python?
Есть парсер, но выводит он не всегда и медленно работает, как можно поправить и ускорить?
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import urllib.request
import time
import re
import sys
import requests
regex = r"price_85d2b9c\s+\w+\D+(?P<price>\d+\s+\d+)"
class Client(QWebEnginePage):
def __init__(self,url):
global app
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.html = ""
self.loadFinished.connect(self.on_load_finished)
self.load(QUrl(url))
self.app.exec_()
def on_load_finished(self):
self.html = self.toHtml(self.Callable)
self.loadFinished(bool)
print("Load Finished")
def Callable(self,data):
self.html = data
self.app.quit()
url = "https://www.aviasales.ru/search/PEE0712MOW23121?request_source=search_form&expected_price_currency=rub&expected_price_source=calendar"
client_response = Client(url)
#print(client_response.html)
test_str = client_response.html
prices = []
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
#print("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
prices.append("{group}".format(group = match.group(groupNum)))
#print(prices)
Ответы (1 шт):
Данный ответ сформулирован Искусственный интеллектом. Возможны ошибки!
Есть несколько вещей, которые вы можете сделать, чтобы улучшить производительность и вывод этого скрипта.
Во-первых, вы можете использовать метод findall модуля re для поиска всех совпадений с регулярным выражением вместо использования метода finditer и перебора совпадений. Это сделает код более эффективным и сократит время, необходимое для поиска совпадений.
Во-вторых, вы можете использовать метод search модуля re, чтобы найти первое совпадение с регулярным выражением, а затем использовать метод group для извлечения совпадающей группы вместо использования метода finditer и перебора групп совпадений. Это сделает код проще и эффективнее.
В-третьих, вы можете использовать функцию time.perf_counter для измерения времени, необходимого для поиска совпадений и извлечения группы, а затем распечатать время в конце скрипта. Это поможет вам увидеть, сколько времени требуется скрипту для запуска, и определить любые узкие места в коде.
Вот пример того, как вы можете изменить код, чтобы сделать его более эффективным и более согласованным:
import time
import re
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEnginePage
class Client(QWebEnginePage):
def __init__(self, url):
self.app = QApplication([])
QWebEnginePage.__init__(self)
self.html = ""
self.loadFinished.connect(self.on_load_finished)
self.load(QUrl(url))
self.app.exec_()
def on_load_finished(self):
self.html = self.toHtml(self.Callable)
def Callable(self, data):
self.html = data
self.app.quit()
regex = r"price_85d2b9c\s+\w+\D+(?P<price>\d+\s+\d+)"
url = "https://www.aviasales.ru/search/PEE0712MOW23121?request_source=search_form&expected_price_currency=rub&expected_price_source=calendar"
start = time.perf_counter()
client_response = Client(url)
html = client_response.html
match = re.search(regex, html)
if match:
price = match.group("price")
print(f"Price: {price}")
else:
print("No match found")
end = time.perf_counter()
print(f"Time taken: {end - start:.2f} seconds")