2017-08-21 3 views
0

J'utilise une fonction qui prend trop de temps à finir car elle nécessite une grande entrée et utilise deux boucles imbriquées.utiliser multiprocessing pour implémenter une fonction en python

Le code de la fonction:

def transform(self, X): 
     global brands 
     result=[] 
     for x in X: 
      index=0 
      count=0 
      for brand in brands: 
       all_matches= re.findall(re.escape(brand), x,flags=re.I) 
       count_all_match=len(all_matches) 
       if(count_all_match>count): 
        count=count_all_match 
        index=brands.index(brand) 

      result.append([index]) 
     return np.array(result) 

Alors, comment changer le code de cette fonction afin qu'elle utilise multitraitement afin d'optimiser le temps de fonctionnement?

Répondre

0

Je ne vois pas l'utilisation de self dans la méthode transform. J'ai donc fait une fonction commune.

import re 
import numpy as np 

from concurrent.futures import ProcessPoolExecutor 

def transformer(x): 

    global brands 

    index = 0 
    count = 0 

    for brand in brands: 

     all_matches = re.findall(re.escape(brand), x, flags=re.I) 

     count_all_match = len(all_matches) 

     if count_all_match > count: 

      count = count_all_match 

      index = brands.index(brand) 

    return [index] 

def transform(X): 

    with ProcessPoolExecutor() as executor: 
     result = executor.map(transformer, X) 

    return np.array(list(result)) 
+0

disons marques = [ "a", "b", "c"] et je veux voir le résultat de transformation ([ "amine", "Mejri"]) .Pourquoi je reçois avec mon premier function: array ([[0], [0]]) pendant que je reçois avec votre fonction en utilisant multiprocess: array (, dtype = object). Je devrais voir le même résultat? – camel

+0

Désolé, j'ai oublié de transformer le générateur en liste. J'ai mis à jour le code. – stamaimer

+0

merci c'était utile :) – camel