2016-03-15 28 views
1

当考虑在python中创建一个类时,只是为了定义一些属性,据我所知,应该考虑使用更好的数据类型,比如namedtuple,它被认为更有效。正在产生一个被认为是资源浪费的python类吗?

我的问题 - 这是真的,在这种情况下,它更好地使用namedtuple或可能是字典?在这种情况下,python类不会是有效的解决方案吗?一般来说,我应该什么时候避免创建一个新类并选择另一种数据类型?

感谢 斯万

回答

0

当你创建一个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过得很愉快的方法

0

不,定义一个类不被视为浪费。到目前为止,99.9%的程序中最重要的考虑因素是代码的清晰度。编写最能表达你想法的代码。

0

我认为标准类和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万

那么的字典似乎更轻

相关问题