使用pool.map将函数并行应用于字符串列表?

时间:2015-09-25 19:10:21

标签: python python-2.7 parallel-processing

我有一个很大的http用户代理字符串列表(取自pandas数据帧)我试图使用ua-parser的python实现解析。我只能使用单个线程解析列表,但基于一些初步的速度测试,我需要花费10个多小时来运行整个数据集。

我正在尝试使用pool.map()来缩短处理时间,但似乎无法弄清楚如何让它发挥作用。我已经阅读了十几个教程'我在网上发现并搜索了SO(可能是某种类似的重复,因为有很多类似的问题),但是数十次尝试都没有因某种原因而起作用。我假设/希望它很容易解决。

这是我到目前为止所做的:

from ua_parser import user_agent_parser    

http_str = df['user_agents'].tolist()

def uaparse(http_str):
        for i, item in enumerate(http_str):
            return user_agent_parser.Parse(http_str[i])

pool = mp.Pool(processes=10)
parsed = pool.map(uaparse, range(0,len(http_str))

现在我看到以下错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-701fbf58d263> in <module>()
      7 
      8 pool = mp.Pool(processes=10)
----> 9 results = pool.map(uaparse, range(0,len(http_str)))

/home/ubuntu/anaconda/lib/python2.7/multiprocessing/pool.pyc in map(self, func, iterable, chunksize)
    249         '''
    250         assert self._state == RUN
--> 251         return self.map_async(func, iterable, chunksize).get()
    252 
    253     def imap(self, func, iterable, chunksize=1):

/home/ubuntu/anaconda/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout)
    565             return self._value
    566         else:
--> 567             raise self._value
    568 
    569     def _set(self, i, obj):

TypeError: 'int' object is not iterable

提前感谢您提供的任何帮助/指示。

1 个答案:

答案 0 :(得分:1)

您似乎只需要:

http_str = df['user_agents'].tolist()

pool = mp.Pool(processes=10)
parsed = pool.map(user_agent_parser.Parse, http_str)