Jak zrównoleglać prostą pętlę Pythona? Jest to prawdopodobnie trywialne pytanie, ale jak zrównoleglać następującą pętlę w Pythonie?

df["a"] = np.where(pd.notnull(df["a"]) == True, 6, 0)
df["b"] = np.where(pd.notnull(df["b"]) == True, 2, 0)
df["b"] = np.where(pd.notnull(df["b"]) == True, 1, 0)
df["c"] = np.where(pd.notnull(df["c"]) == True, 1, 0)
df["d"] = np.where(pd.notnull(df["d"]) == True, 1, 0)
df["e"] = np.where(pd.notnull(df["e"]) == True, 2, 0)
df["f"] = np.where(pd.notnull(df["f"]) == True, 1, 0)
df["g"] = np.where(pd.notnull(df["g"]) == True, 2, 0)
df["h"] = np.where(pd.notnull(df["h"]) == True, 2, 0)
df["i"] = np.where(pd.notnull(df["i"]) == True, 2, 0)

Jaki jest najłatwiejszy sposób na zrównoleglenie tego kodu?

Próbuję

df = ["a", "b","c", "d",.....]
df_score = [6,2,1,1, .....]
  for I in range():
df[I] = np.where(pd.notnull(df[I]) == True, df_score[I], 0)
0
tomy 21 marzec 2020, 08:22

2 odpowiedzi

Najlepsza odpowiedź

Jeśli próbujesz uprościć swój kod za pomocą struktur danych Pythona, sugeruję użycie słownika (kombinacja wartości df i df_score w strukturze klucz-wartość):

dct = {"a" : 6, "b" : 2, "c" : 1}  # fill-in the rest of values
for key in dct:
   df[key] = np.where(pd.notnull(df[key]) == True, dct[key], 0)

Jeśli masz na myśli programowanie równoległe, to jest to zupełnie inny problem, zobacz wątki w pythonie: https : //docs.python.org/3/library/threading.html

0
Guy_g23 28 marzec 2020, 09:56

Aby uzyskać równoległe wykonanie, możesz użyć wątków:

# initialize df as before

import concurrent.futures

with concurrent.futures.ThreadPoolExecutor() as pool:
    def update(key, score):
        df[key] = np.where(pd.notnull(df[key]) == True, score, 0)

    for key, score in ("a", 6), ("b", 2), ...:
        pool.submit(update, key, score)

To, czy rzeczywiście spowoduje to przyspieszenie, zależy od tego, czy Pandy zwolnią GIL podczas swoich obliczeń. Jedynym sposobem na poznanie jest mierzenie.

1
user4815162342 28 marzec 2020, 10:01