Python作业问题——优化

Published: 13 Mar 2014 Category:

网易作业成绩发下来了,额,不太好,但是我挺开心。 去一个大家都比自己牛的地方工作,才有进步的空间。

项目: JsonParser – Python json转换


1

整体来说,段与段之间过于紧密,阅读不太方便。

2

一一对应的关系,一般使用dict类型。

def dealZhuanyi

这个函数,像里面的那些if else的判断,其实可以改为用一个dict来实现,这样简洁,并且效率更高

3

判读一个元素是否属于一个集,一般使用set或者frozenset,不使用list.

in操作在列表中,通过遍历判断。

而set是一组无序排列的可哈希值,所以in操作效率更高。

def dealIgnoreChar:
  while string[curIndex] in ignoreChar

像这个while xx in list,你知道它是怎么样判断in的么?

水风 - 但求顺利回家过年 说: (2014-02-26 12:17:27)
内部的机制么?遍历?

师傅 - =^_^=  说: (2014-02-26 12:17:34)
其实就是遍历

水风 - 但求顺利回家过年 说: (2014-02-26 12:18:01)
哦,那就效率不高了,可以改成索引结构的

师傅 - ~@^_^@~ 说: (2014-02-26 12:18:09)
当然,你这里的list数量少没所谓,不过如果数量大的话,可以考虑把list改为用set或者frozenset

师傅 - ∩__∩y 说: (2014-02-26 12:18:31)
用集合set判断效率会更高

水风 - 但求顺利回家过年 说: (2014-02-26 12:18:42)
嗯

水风 - 但求顺利回家过年 说: (2014-02-26 12:18:54)
python以前没用过,里面的机制不太熟悉

4

在循环判断语句中,如果是用函数,去注意函数返回值是否每次循环都不一样。如果都一样,那么写在循环判断语句外,否则每次循环都会执行函数。

师傅 - Y(^_^)Y 说: (2014-02-26 12:18:57)
def getString(string):
  ...
  while curIndex<len(string):     # len(string)可以用一个常量


水风 - 但求顺利回家过年 说: (2014-02-26 12:19:10)

有空看看你给我推荐的那个python源码的书


师傅 - =^_^=  说: (2014-02-26 12:19:46)

这个while,我看你的string是个定长的,所以其实并不需要每次都用len(string)

师傅 - Y(^_^)Y 说: (2014-02-26 12:20:09)

len_s = len(string)
while xx < len_s:
这样会更好

水风 - 但求顺利回家过年 说: (2014-02-26 12:21:14)
哦,我明白了,我用的这个方法每次循环都计算一次len(string)。

师傅 - ∩__∩y 说: (2014-02-26 12:21:44)
yes,我看下面还有好些地方也是这样做,以后可以注意一下,像C#、C++中类似的情况也可以留意

5

字典dict的内部结构和实现机制如下:key作为可哈希类型,根据key的哈希值,存储(key,value)对。因此,dict中通过key的访问速度很快。

dict.kyes()返回键值列表(List类型)。 if c in charToZhuanYi.keys():这句话的内部机制是:先获得一个列表,然后循环查找,速度很慢。

for key in d.keys():对于这句话,内部的实现机制为生成一个list,然后遍历。可以直接使用for key in d:。 key in dict:判断key是否属于dict中的关键字。

师傅 - ^_^ 说: (2014-02-26 12:22:38)
def convertStringToJson(s):
  ..
  if c in charToZhuanYi.keys():

你知道dict.keys()是个什么吗?

水风 - 但求顺利回家过年 说: (2014-02-26 12:23:06)
把字典的所有key作为集合返回~

师傅 - ∩__∩y 说: (2014-02-26 12:23:37)
>>> d
{1: 2, 3: 4, 5: 6}
>>> d.keys()
[1, 3, 5]

师傅 - Y(^_^)Y 说: (2014-02-26 12:23:43)
这是个集合?

水风 - 但求顺利回家过年 说: (2014-02-26 12:23:57)
额,元组...

师傅 - =^_^=  说: (2014-02-26 12:24:10)
no,是个list

水风 - 但求顺利回家过年 说: (2014-02-26 12:24:26)
额,元组是()

师傅 - ~@^_^@~ 说: (2014-02-26 12:25:16)
所以,你这里,if c in charToZhuanYi.keys():
每次判断,它都会创建一个list,会不会觉得很耗?

水风 - 但求顺利回家过年 说: (2014-02-26 12:25:50)
嗯,我好想用的都是这种方法

水风 - 但求顺利回家过年 说: (2014-02-26 12:25:54)
好像

师傅 - Y(^_^)Y 说: (2014-02-26 12:26:24)
你觉得可以有怎么样的改法呢?

水风 - 但求顺利回家过年 说: (2014-02-26 12:27:02)
可不可以直接去用c作为key去查字典

师傅 - ^_^ 说: (2014-02-26 12:28:33)
这是一个方法,可行,不过看上去不太直观。不过比你现在这个keys()的方法好。

水风 - 但求顺利回家过年 说: (2014-02-26 12:29:08)
或者直接定义一个key的set

师傅 - ^_^ 说: (2014-02-26 12:29:34)
这个也可以

师傅 - ^_^ 说: (2014-02-26 12:29:44)
for key in d.keys():
那像这种,可以怎么样改知道不?

水风 - 但求顺利回家过年 说: (2014-02-26 12:31:04)

从效率的角度,d.keys()每次循环都要计算一次,可以先计算出来keys(),改为一个set,然后再去判断

师傅 - ~@^_^@~ 说: (2014-02-26 12:32:22)
right,可行

师傅 - ^_^ 说: (2014-02-26 12:32:55)
for key in d.keys():
比如说,d有N个int的key,那这种写法,在运行时,它大约会生成多少个int?

水风 - 但求顺利回家过年 说: (2014-02-26 12:34:32)
每次循环,都生成一个有N个元素的List】

师傅 - ^_^ 说: (2014-02-26 12:35:18)
那倒不会

师傅 - =^_^=  说: (2014-02-26 12:36:01)
它只会生成1次有N个元素的list,然后迭代此list。
所以如果你的字典有1W个元素,它会生成一个大小为1W的list

师傅 - Y(^_^)Y 说: (2014-02-26 12:36:33
so,有没有其它办法,不用生成这么多余的list?

师傅 - =^_^=  说: (2014-02-26 12:37:02)
你可以翻下dict的文档,keys values items这三个函数,有对应的另外一个版本的##我才是使用key in d就可以。

水风 - 但求顺利回家过年 说: (2014-02-26 12:37:27)
哦,那我去看看。

6

师傅 - Y(^_^)Y 说: (2014-02-26 12:37:45)
最后你有一个应该是手误吧。
def loadJson
  ..
  fp.close     # ---close()?

师傅 - ~@^_^@~ 说: (2014-02-26 12:37:57)
看出啥问题没?

水风 - 但求顺利回家过年 说: (2014-02-26 12:38:51)
close应该是一个函数 = =

师傅 - ^_^ 说: (2014-02-26 12:39:11)
嗯,差不多就这些吧

水风 - 但求顺利回家过年 说: (2014-02-26 12:39:24)
这个close为啥没报错呢

师傅 - ~@^_^@~ 说: (2014-02-26 12:39:48)
不会报错,你可以引用了一个函数而已