Скорость открытия файла.

Автор Massaraksh7, 26 мая 2024, 20:33

0 Пользователи и 2 гостей просматривают эту тему.

Massaraksh7

А есть вероятность, что на пайтоне быстрее будет?

Massaraksh7

#16
О! Интересный эффект обнаружил. Если сначала заполнять данными, а потом делать merge - то 28 секунд.
А если наоборот - то 18 секунд!
Не, ну логично, но всё-таки, разница существенная.

Massaraksh7

Цитата: Massaraksh7 от 28 мая 2024, 00:25А есть вероятность, что на пайтоне быстрее будет?
Поэкспериментировал с Пайтон. Всё очень интересно.
Итак, чтение данных из текстового файла, каждая строка - одно число. Всего строк - 244728. И запись их на лист через DataArray.

Вот такой код работает 19 секунд.
doc.CurrentController.Frame.ContainerWindow.setVisible(False)
m=27
n=9064
mss = [[0 for j in range(m)] for i in range(n)]    # массив n x m - n строк, m столбцов
f = open('c:/laz-aep/sendonly.srv', 'r')
for i in range(0,n):
    for j in range(0,m):
        s = f.readline()
        mss[i][j]=s
f.close()       
rcell = sheet.getCellRangeByPosition(0,0,26,9063)
rcell.DataArray = mss       
doc.CurrentController.Frame.ContainerWindow.setVisible(True)
exit()

А вот такой - полсекунды.
doc.CurrentController.Frame.ContainerWindow.setVisible(False)
m=27
n=9064
mss = [[0 for j in range(m)] for i in range(n)]    # массив n x m - n строк, m столбцов
f = open('c:/laz-aep/sendonly.srv', 'r')
for i in range(0,n):
    for j in range(0,m):
        s = f.readline()
        mss[i][j]=int(s)
f.close()       
rcell = sheet.getCellRangeByPosition(0,0,26,9063)
rcell.DataArray = mss       
doc.CurrentController.Frame.ContainerWindow.setVisible(True)
exit()

Как тебе такое, Илон Маск?

Massaraksh7

Ладно, я - спать. Итак впечатлений много на сегодня.

economist

#19
Работа с чистыми типами (inf, float) всегда быстрее.
Надо на Python использовать Pandas/Numpy, там д.б. еще быстрее (C, Fortran). Эти либы ставятся в LO Python, главное вручную установить pip, есть ветка на Форуме про Pandas. Читать и обрабаотывать файлы лучше целиком, а не построчно (векторизация, операции над целыми столбцами, а не над скалярами/ячейками).

Вместо  mss = ... f.close  можно так (не проверял):

import pandas as pd
mss = pd.read_csv('c:/laz-aep/sendonly.srv', dtype = int)

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Massaraksh7

Цитата: economist от 28 мая 2024, 08:24Работа с чистыми типами (inf, float) всегда быстрее.
Да, но в реальной жизни, к сожалению, так не будет. У меня это просто контрольный пример с числами, но в реальных данных будут и целые, и вещественные, и строки.

sokol92

Выгрузите, пожалуйста, контрольный пример в виде csv-файла, попробуем на нем потренироваться, когда будет возможность (цель - уменьшить время в 18 сек.)

Насчет разницы времени в #17 - работа с числами быстрее, чем с текстами.

Кстати, в Calc меньше типов ячеек, чем в Excel: пустые, числа (double), тексты, ошибочные значения (нет логических значений).
Владимир.

Massaraksh7

Цитата: sokol92 от 28 мая 2024, 16:32контрольный пример в виде csv-файла,
Который? У меня здесь их несколько.

sokol92

Цитата: Massaraksh7 от 28 мая 2024, 00:44О! Интересный эффект обнаружил. Если сначала заполнять данными, а потом делать merge - то 28 секунд.
А если наоборот - то 18 секунд!
Не, ну логично, но всё-таки, разница существенная.
Владимир.

Massaraksh7


Massaraksh7

Но это файлы с данными и с командами.

sokol92

Владимир.

sokol92

По третьему столбцу можно мгновенно объединить ячейки, если объединить первые две ячейки и протянуть вниз. Макрорекордер записывает рабочий вариант (не всегда это так).
Этот же трюк можно сделать и макросом.
Владимир.

economist

В Pandas тоже правильнее собрать list из  pd.DataFrame-ов и потом сделать pd.concat() - собрать в один. Быстрее - в разы, RAM - меньше в разы. Это потому что Pandas создаёт много копий объектов, а сборщик мусора Python достаточно ленив, чтобы сразу их удалять.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Massaraksh7

Цитата: sokol92 от 28 мая 2024, 17:24По третьему столбцу можно мгновенно объединить ячейки, если объединить первые две ячейки и протянуть вниз.
Да, и по 19-тому. Но такая удача - редкость.