当前位置: 首页 > 面试题库 >

Python:从该类内部对作为类的数据成员的函数进行多处理的有效解决方法

南宫才英
2023-03-14
问题内容

当处理作为类的数据成员的函数时(由于酸洗问题),我知道关于多重处理模块的局限性的各种
讨论。

但是,是否存在另一个模块或多处理中的任何变通方法,该模块允许类似以下的内容(特别是在不强制将函数定义并行应用到类外部的情况下)?

class MyClass():

    def __init__(self):
        self.my_args = [1,2,3,4]
        self.output  = {}

    def my_single_function(self, arg):
        return arg**2

    def my_parallelized_function(self):
        # Use map or map_async to map my_single_function onto the
        # list of self.my_args, and append the return values into
        # self.output, using each arg in my_args as the key.

        # The result should make self.output become
        # {1:1, 2:4, 3:9, 4:16}


foo = MyClass()
foo.my_parallelized_function()
print foo.output

注意:我可以通过移到my_single_function类之外并将类似的内容传递foo.my_argsmapormap_async命令来轻松地做到这一点。但这将功能的并行执行推到的实例之外MyClass

对于我的应用程序(并行处理一个大型数据查询,该查询可检索,联接和清除数据的每月横截面,然后将它们附加到此类横截面的较长时间序列中),在此应用程序 内部
具有此功能非常重要 类,
因为我的程序的不同用户将以不同的时间间隔,不同的时间增量,要收集的数据的不同子集等等实例化该类的不同实例,所有这些都应与该实例相关联。

因此,我希望并行化工作也可以由实例完成,因为它拥有与并行化查询相关的所有数据,并且尝试编写一些绑定到某些参数并位于外部的hacky包装函数实在是愚蠢的类(特别是因为此类函数将是非泛型的。它将需要类内部的各种详细信息。)


问题答案:

史蒂文·贝萨德(Steven Bethard
)发布了一种允许对方法进行腌制/解腌的方法。您可以这样使用它:

import multiprocessing as mp
import copy_reg
import types

def _pickle_method(method):
    # Author: Steven Bethard
    # http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
    func_name = method.im_func.__name__
    obj = method.im_self
    cls = method.im_class
    cls_name = ''
    if func_name.startswith('__') and not func_name.endswith('__'):
        cls_name = cls.__name__.lstrip('_')
    if cls_name:
        func_name = '_' + cls_name + func_name
    return _unpickle_method, (func_name, obj, cls)

def _unpickle_method(func_name, obj, cls):
    # Author: Steven Bethard
    # http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
    for cls in cls.mro():
        try:
            func = cls.__dict__[func_name]
        except KeyError:
            pass
        else:
            break
    return func.__get__(obj, cls)

# This call to copy_reg.pickle allows you to pass methods as the first arg to
# mp.Pool methods. If you comment out this line, `pool.map(self.foo, ...)` results in
# PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
# __builtin__.instancemethod failed

copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)

class MyClass(object):

    def __init__(self):
        self.my_args = [1,2,3,4]
        self.output  = {}

    def my_single_function(self, arg):
        return arg**2

    def my_parallelized_function(self):
        # Use map or map_async to map my_single_function onto the
        # list of self.my_args, and append the return values into
        # self.output, using each arg in my_args as the key.

        # The result should make self.output become
        # {1:1, 2:4, 3:9, 4:16}
        self.output = dict(zip(self.my_args,
                               pool.map(self.my_single_function, self.my_args)))

然后

pool = mp.Pool()   
foo = MyClass()
foo.my_parallelized_function()

产量

print foo.output
# {1: 1, 2: 4, 3: 9, 4: 16}


 类似资料:
  • 本文向大家介绍python 对类的成员函数开启线程的方法,包括了python 对类的成员函数开启线程的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python 对类的成员函数开启线程的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍python数据处理 根据颜色对图片进行分类的方法,包括了python数据处理 根据颜色对图片进行分类的方法的使用技巧和注意事项,需要的朋友参考一下 前面一篇文章有说过,利用scrapy来爬取图片,是为了对图片数据进行分类而收集数据。 本篇文章就是利用上次爬取的图片数据,根据图片的颜色特征来做一个简单的分类处理。 实现步骤如下: 1:图片路径添加 2:对比度处理 3:滤波处理 4:数

  • 本文向大家介绍Python实现动态添加类的属性或成员函数的解决方法,包括了Python实现动态添加类的属性或成员函数的解决方法的使用技巧和注意事项,需要的朋友参考一下 某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法。用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块。 本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下

  • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

  • 我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用

  • 问题内容: 在Python中,该模块可用于在一系列值上并行运行函数。例如,这将生成f的前100000个评估的列表。 当f接受多个输入而只有一个变量变化时,是否可以做类似的事情?例如,如何并行处理此: 问题答案: 有几种方法可以做到这一点。在问题给出的示例中,您可以定义一个包装函数 然后将此包装传递给。一种更通用的方法是使用一个包装器,该包装器使用一个元组参数并将该元组解包为多个参数 或使用等效的l