/ / python - Qual é o caminho mais rápido para substituir linhas de um arquivo de um dicionário? - python, performance, dicionário, io, mapeamento

python - Qual é o caminho mais rápido para substituir linhas de um arquivo de um dicionário? - python, performance, dicionário, io, mapeamento

Eu tenho 1 mil arquivos cada um com 1 milhão de linhas. Eu tenho um dicionário que tem cerca de 2 milhões de chaves e as atribui a 2 milhões de números únicos de 1 a 2 milhões. Então, as entradas são como as seguintes:

dictionary = {
"hakuchita.mutikama" : 3,
"mitiputu.mitanata" : 4,
"pulasika.rukayota" : 1,
"luschi.rulu.pitana" : 2
}

Cada linha de cada arquivo é uma dessas chaves. E quero substituir todas essas chaves por seus valores.

Aqui está o meu código:

for filename in os.listdir("data"):
with fileinput.FileInput("data/" + filename, inplace=True) as file:
for line in file:
print(dictionary[line[:-1]])

Mas eu apenas corri meu código e está demorando.

Qual é a maneira mais rápida de fazer isso?

Respostas:

1 para resposta № 1

Em vez de pegar cada chave uma por uma e chamar o dicionário separadamente, você pode fazer isso de uma só vez. Digamos que um dos seus arquivos de texto contenha isto:

hakuchita.mutikama
mitiputu.mitanata
luschi.rulu.pitana

Pegue todas as chaves de uma só vez:

with open("sampleText.txt","r") as f:
keys = f.read().splitlines()

Este é o seu dicionário no OP:

dictionary = {
"hakuchita.mutikama" : 3,
"mitiputu.mitanata" : 4,
"pulasika.rukayota" : 1,
"luschi.rulu.pitana" : 2
}

Obtenha todos os valores agora:

values = [dictionary[e] for e in keys]

Resultado:

[3, 4, 2]

Agora, como @chepner aponta brilhantemente em seu comentário, se você fizer:

dictionary = dict([(k+"n",v) for k,v in dictionary.items()])

você pode se livrar do .splitlines() no meu código acima, leia o arquivo usando keys = f.readlines()e economize o tempo .splitlines() levaria. Você pode otimizar todo esse procedimento por processamento paralelo, como menciona @JuanAntonio.


1 para resposta № 2

Você pode usar multiprocessamento pacote python que simplifica o threading (entre outros) para acelerar o seu código.

Aqui você pode ver um bom post de onde está falando e alguns vídeos.


1 para resposta № 3

A desaceleração está acontecendo porque você está fazendo umescrever linha por linha. Em vez disso, escreva todos os dados em uma string (1 milhão de linhas ainda deve estar bem para armazenar na memória) e grave o arquivo de uma só vez.