ускорить цикл кодирования кадра данных

Используя python 3.76, Pandas 1.0.1, на процессоре Intel 8700, в лаборатории jupyter. Этот код

import time
import base64
import numpy as np
import pandas as pd
#read in data
words = pd.read_table("BigFile.txt",names=['word'],encoding="utf-8",header=None)
#add a column to hold encoded data
dfWords = pd.DataFrame(columns=['sb64'])
start = time.perf_counter() 
#encode data and add it to column
for x in range(10000):
    dfWords = dfWords.append({'sb64':base64.b64encode(words.word[x].encode('UTF-8')).decode()},ignore_index=True)
end = time.perf_counter() 
print(end - start, "seconds")
print("Dataframe Contents ", dfWords, sep='\n')

производит этот вывод

12.090909591002855 seconds
Dataframe Contents 
                  sb64
0     ZGlmZmVyZW5jZQ==
1             d2hlcmU=
2                 bWM=
3                 aXM=
4                 dGhl
...                ...
9995      ZGl2ZXJ0b3I=
9996              aW4=
9997              d2Fz
9998              YXQ=
9999              dGhl

[10000 rows x 1 columns]

Мой файл данных содержит 10 000 000 строк, что в 1000 раз больше, чем этот небольшой тест, который занял 12 секунд.

Я пытался сделать это:

import time
import base64
dfWords = pd.DataFrame(columns=['sb64'])
start = time.perf_counter() 
dfWords['sb64']= words.word.str.encode('utf-8', 'strict').str.encode('base64').str.decode('utf-8', 'strict')
end = time.perf_counter() 
print(end - start, "seconds")
print(dfWords.tail())

но не получилось с ошибкой

TypeError: Cannot use .str.encode with values of inferred dtype 'bytes'.

Однако, если я понизил Pandas до 0,23, это сработает, и я смогу сделать миллион записей за 4 секунды.

3.5494491000026756 seconds
                      sb64
999995  ZGlzdHJpYnV0aW9u\n
999996              aW4=\n
999997      c2NlbmFyaW8=\n
999998          bGVzcw==\n
999999          bGFuZA==\n

Таким образом, мой полный файл из 10 миллионов строк занял бы 40 секунд. Должен ли я изучать C, а также все эти инструменты, чтобы работать быстрее? или есть лучший способ Python?


person aquagremlin    schedule 17.02.2020    source источник
comment
это операция чувствительная ко времени?   -  person gold_cy    schedule 18.02.2020
comment
чувствителен ко времени Является относительным. Но это часть более крупного проекта по науке о данных, и я вижу, что в будущем будут использоваться еще большие наборы данных. В этом посте также рассматриваются мои проблемы с размером /23569771/   -  person aquagremlin    schedule 18.02.2020
comment
два подхода также различаются, я не удивлен, что зацикливание и добавление к кадру данных значительно медленнее, чем использование оптимизированных методов str непосредственно в столбце   -  person gold_cy    schedule 18.02.2020