需要操作的数据的结构如下,最后要输出回文件上(有序)
key1, key2, key3, key4, key5
v11, v12, v13, va14, v15
v21, v22, v23, v24, v25
v31, v32, v33, v34, v35
我在看到有人是为每一行创建一个 instance ,把所有的 instance 都保存在列表里,要修改某些数据的时候就用 instance.key4=v44 这样的形式来修改。我觉得明明可以用字典来实现呀,为什么要这么复杂呢。
所以我想知道这种为每行创建一个 instance 的写法有什么好处吗?
另外,假如要用字典的形式来处理每一行,那我用 OrderedDict 是不是比自己再另外造一个表要好得多瞎搞要好很多(效率上)?
1
cheetah 2016-10-04 19:10:41 +08:00
没能懂
|
2
BingoXuan 2016-10-04 19:22:55 +08:00
个人觉得缺点在于每一增加一行就要创建一个新的 instance 。随着数据量增加,要添加的 instance 就越来越多,维护起来很麻烦,显得不够简洁。
对于数据我一般都用 pandas 处理,感觉相对简便一点。 |
3
reus 2016-10-04 20:02:19 +08:00
内存占用小一些,类实例比 dict
|
4
binux 2016-10-04 20:05:04 +08:00
字典就不是 instance 了?! OrderedDict 就不是 instance 了?!
|
5
soratadori OP @binux 但是写起来不方便 0.0 就是想知道这种写法有啥好处。
|
6
binux 2016-10-04 20:32:09 +08:00
@soratadori 有什么不方便的了?重载一个 __getitem__ 就一样 instance['key4'] 了,有什么区别?!还能增加方法,有什么不好?
|
7
soratadori OP @reus 从可读性,易维护性之类的角度来考虑的话呢?
我发现不同的读取属性的方式,速度也有显著的不同。像 getattr() 比在实例里内置一个返回函数(instance.get())要快差不多 100%。那么应该鼓励用可读性最好的方式还是应该用比较严谨的方式? |
8
soratadori OP @binux 额。。。你说的也没错
|
9
soratadori OP 我后来也尝试过这种写法,对于严谨点的要求可能是比用字典要显得更优雅点,只是看上去不够直观,比如用 OrderedDict 能完成的事,用 instance 的话,就需要用列表排序+字典检索,所以我比较想知道一般普遍推荐用哪种方法,这两种方法从速度、可读性、易维护性的角度来考虑的话,有没有哪种有显著性的优势。
|
10
reself 2016-10-04 21:57:10 +08:00 via Android
过早优化是万恶之源
|
11
ruoyu0088 2016-10-04 22:06:42 +08:00
如果键是可以用变量名表示的话,那么用实例比较方便。如果行数很多的话还可以通过__slots__节省内存。
|
12
soratadori OP @reself 这个脚本我已经写了很久了,但自己还是太菜了 →_→
|
13
soratadori OP @ruoyu0088 属性确实可以用变量名,但是跟据获取属性的方法的不同,速度也不一样。
这 3 种方法你觉得哪种比较好, instance.key ; instance.get(), get()里调用 resturn self.key ; getattr() 就我测试来说,后面一个总比前面一个快 1 倍,但丑陋程度也增加一倍。 |
14
ruoyu0088 2016-10-05 06:31:41 +08:00
|
15
kaneg 2016-10-05 09:20:09 +08:00 via iPhone
在程序跑起来之前不要过早考虑性能的问题,而应该用最容易理解的方式实现。
|
16
reself 2016-10-06 09:43:56 +08:00 via Android
@soratadori 个人感觉这段代码的瓶颈应该在于磁盘 IO ,因此,就时间上,很可能 class 和 dict 两种实现的差异并不大。空间上,算法不变的话,消耗也差不多,顶多多个常量。不妨测试一下这两种实现的时间和空间差异~
还有,有个观点,调用者不需要关心被调用的方法是如何实现的,调用者只关心方法实现的功能,至于实现的机制、效率调用者不需要也没必要去关心。简言之就是高内聚低耦合。 |
17
reself 2016-10-06 09:49:43 +08:00 via Android
提高可读性是肯定要牺牲效率的,两者之间取好平衡点折衷处理。一切皆对象。
|
18
BiggerLonger 2016-10-06 17:03:58 +08:00
为啥不用 NamedTuple 呢?
|