当考虑在python中创建一个类时,只是为了定义一些属性,据我所知,应该考虑使用更好的数据类型,比如namedtuple,它被认为更有效。正在产生一个被认为是资源浪费的python类吗?
我的问题 - 这是真的,在这种情况下,它更好地使用namedtuple或可能是字典?在这种情况下,python类不会是有效的解决方案吗?一般来说,我应该什么时候避免创建一个新类并选择另一种数据类型?
感谢 斯万
当考虑在python中创建一个类时,只是为了定义一些属性,据我所知,应该考虑使用更好的数据类型,比如namedtuple,它被认为更有效。正在产生一个被认为是资源浪费的python类吗?
我的问题 - 这是真的,在这种情况下,它更好地使用namedtuple或可能是字典?在这种情况下,python类不会是有效的解决方案吗?一般来说,我应该什么时候避免创建一个新类并选择另一种数据类型?
感谢 斯万
当你创建一个Python类,您创建包含其属性的每个实例命名空间。它取决于你声明你的元组的位置,但是访问“更大”命名空间中的变量比更“更近”的命名空间中访问变量效率稍低。例如:
toto = [1, 2, 3]
class Toto():
def __init__(self):
self.tup = [1, 2, 3]
print(toto)
toto_inst = Toto()
print(toto_inst.tup)
应该花费更多要做的第一打印比第二,因为托托是在更全局命名空间和toto_inst.tup,Python知道它的确切位置是在内存中,但它一定要看在哪个命名空间中,寻找越来越多的全局命名空间,其中托托变量是。但在75%的案例中,成本是微不足道的。
但是创建实例也有成本,所以它很复杂。如果它只是一个简单的元组,你应该只使用一个变量而不是包含它的类。如果你有更多的属性和命名空间,你应该通过直接看相应的命名空间来选择让python过得很愉快的方法
不,定义一个类不被视为浪费。到目前为止,99.9%的程序中最重要的考虑因素是代码的清晰度。编写最能表达你想法的代码。
我认为标准类和python字典之间有一个小小的差异。
import os
import psutil
class Foo:
def __init__(self, a, b, c, d, e, f, g):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
self.f = f
self.g = g
foos = [Foo(*range(7)) for _ in xrange(10000)]
process = psutil.Process(os.getpid())
print process.memory_info().rss
输出〜15286000
import os
import psutil
foos = [{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6} for _ in xrange(10000)]
process = psutil.Process(os.getpid())
print process.memory_info().rss
输出〜1489万
那么的字典似乎更轻
一般来说,你不应该推倒重来,直到永远。但是,定义适合您需求的课程是完全合理的。请记住,premature optimization is the root of all evil。
我喜欢wiki记录:) – sivan