в csv обрабатываются 20-30 минут?
Довольно медленно, но смотря чё за обработка
async with aiofiles.open(in_path, 'r', encoding='utf-8') as fr: reader = AsyncReader(fr, delimiter=',') async for row in reader: row = row[:len(order)] for i, s in enumerate(row): cur_res += (get_hash(s) if order[i][1] else s) + ';'
cur_res += строка — это квадратичный алгоритм
Для строк - нет
Для начала бы я выкинул асинкио
Попробуй без асинкио
В смысле? Там же каждый раз новая строка формируется, суммарно получается квадрат
как это можно ускорить не подскажете? просто нужно записывать каждые 100тыс записей в новый файл
Нет, если это единственная ссылка на строку, там есть оптимизация
parts = [] parts.append(…) result = “”.join(parts)
хм изначально записывал в массив и сохранял через csv writer, но мне подсказали что в строку формата csv записывать будет быстрее
1. асинкио нахрен, тут все блокирующее 2. срезы хз зачем - это доп копирование 3. что в get_hash происходит?
Вот это прогресс, давно?
Этого уже нет :D
срезы да, просто в файле оказалась лишняя пустая строка. как экономнее можно избавиться от нее просто берет хэш от строки, нужно ли его брать записано в order
да? а как теперь?
хм, у меня в 3.11 вроде есть >>> timeit.timeit("s = ''\nfor i in range(1000000): s += str(i)", number=10) 1.9530952500645071 >>> timeit.timeit("parts = []\nfor i in range(1000000): parts.append(str(i))\ns = ''.join(parts)", number=10) 1.5781069160439074
row = row[:len(order)] это никак не поможет пропустить пустые строки, это ограничивает длину строки количеством ордеров
лишний пусттой столбец точнее
про который нет инфы в order
узнай уже про zip функцию
хм. с аппендом быстрее, ничоси
хм, точно, наверное быстрее чем обрезать но всё же думаю это не основное что замедляет..
асинкио выкинь и замерь
У меня в 3.11 нет: timeit.timeit("s = ''\nfor i in range(1000000): s += str(i)", number=10) 11.015409500003443 timeit.timeit("parts = []\nfor i in range(1000000): parts.append(str(i))\ns = ''.join(parts)", number=10) 0.8897796000092058
вообще это фастапи бэкграунд таск. я просто думал если сразу придет запрос на несколько обработок, не ускорит ли асинкио получение результата? но вообще наверное можно пока принимать только одну обработку, остальные не принимать пока есть активная..
не ускорит, у тебя тут все абсолютно синхронное
@sergemeln проверь-ка у себя
aiosv, aiofiles не делают эти задачи асинхронными?
нет конечно, с чего бы
в чем тогда их смысл?
не имею ни малейшего понятия
>>> timeit.timeit("s = ''\nfor i in range(1000000): s += str(i)", number=10) 19.311255100008566 >>> timeit.timeit("parts = []\nfor i in range(1000000): parts.append(str(i))\ns = ''.join(parts)", number=10) 2.5301578999933554 >>> то есть стоит строку заменить на массив который потом собираю в строку?
Ну тут как вариант сделать отдельный микросервис мелкий который будет работать в многопотоке, и обрабатывать паралельно запросы, а потом их тебе откидывать
стоит попробовать
Если я понял правильно, оно просто файловые операции в отдельные треды уносит, чтобы луп не встал колом.
какая ОС? как питон ставил?
win10, с оф сайта а где-то наоборот быстрее строки?
нужна твоя помощь. У нас не сходятся показания
а у вас у всех одинаковая версия языка?
ну вон у Тиграна и ребят 3.11 у всех
Для интегрирования в асинк код. Какому-нибудь же aiohttp передать (хотя возможно он умеет синхронные файлы грузить не блокируя луп)
У тебя тоже винда?
Обсуждают сегодня