【发布时间】:2015-03-20 12:32:27
【问题描述】:
我有一段代码使用值列表生成对象的实例。例如:
给定一个实现__slots__的简单类
class A(object):
__slots__ = ('a', 'b')
和一个值列表
>>> l = [1, 2]
我们通过
创建对象的一个新实例>>> o = A.__new__(A)
>>> o
<__main__.A object at 0x0617AE70>
然后我们使用列表中的元素填充对象的属性
>>> for idx, element in enumerate(l):
... setattr(o, o.__slots__[idx], element)
>>> o.a
1
>>> o.b
2
我在许多值列表的循环中执行此操作,在分析我的程序后,这是它花费大量时间的地方。我想知道是否有更好的方法可以使用普通 python(没有 pypy 或 cython)更快地做到这一点。
注意事项:
- 我的程序实际上从我的
__slots__对象继承的方法调用cls.__new__(cls)。由于我不知道调用该方法的类,因此这是我发现创建该特定类类型的新实例的唯一方法。 - 我正在从包含值的文件中创建这些对象,但这是程序的要求。
【问题讨论】:
-
这个程序的目的是什么?很抱歉,但由于我不知道它的作用,所以代码相当......难以理解。谢谢!
-
可能不会让您获得更多性能 - 但这样做会更漂亮(“Pythonic”):
for attr, element in zip(o.__slots__, l): setattr(o, attr, l) -
我的猜测是你的问题太具体了。我认为它需要更多的上下文(对于 SO 来说可能太多了?)才能给你一个好的答案。
-
@jsbueno 我确实喜欢你的“Pythonic”方法,因为它更容易阅读,但性能有点差(从快速基准测试来看大约是 5%)。
-
为什么首先需要一个对象(
A的实例)? Python 可以使用普通的数据结构进行繁重的处理。而“oop”方式往往是不必要的复杂性的来源。
标签: python performance python-internals slots