比这篇新的文章:
aa
比这篇旧的文章: python.普通 IP 转换为十进制 IP
作者: onenew, 点击683次, 评论(5), 收藏者(1)
打分:
所有评论,共5条:( 我也来说两句)
比这篇旧的文章: python.普通 IP 转换为十进制 IP
生成四位不重复数字(0-9)的所有组合
语言: Python, 标签: 代码优化 排列 2008/06/22发布 5个月前更新作者: onenew, 点击683次, 评论(5), 收藏者(1)
Python语言: 生成四位不重复数字(0-9)的所有组合
001 #coding=cp936
002 #关于这个问题的精彩讨论参见这里
003 # http://groups.google.com/group/python-cn/browse_thread/thread/4d9eda8e422a6cf8
004
005 #在我的电脑上
006 #init_set 1000 times 5.529
007 #init_set2 1000 times 4.674
008 #init_set3 1000 times 3.287
009 #init_set4 1000 times 18.271
010 #init_set5 1000 times 2.069
011
012 def init_set8(r10=range(10)):
013 """
014 把循环内的range函数提到外面
015 times5.486 ==> 4.427
016 """
017 ret = []
018 for i in r10:
019 for j in r10:
020 for k in r10:
021 for l in r10:
022 if i != j and i != k and i != l and j != k and j != l and k != l:
023 ret.append((i, j, k, l))
024 return ret
025 timing(init_set8, 1000)
026 def init_set9(r10=range(10)):
027 """
028 for 循环改成列表推导
029 times5.486 ==>3.773
030 """
031 return [(i, j, k, l)
032 for i in r10
033 for j in r10
034 for k in r10
035 for l in r10
036 if ( i != j and i != k and i != l and j != k and j != l and k != l) ]
037 timing(init_set9, 1000)
038
039 def init_set10(r10=range(10)):
040 """
041 return 一个 generator
042 init_set10 1000 times 0.004
043 这个无疑是最快的 :P
044 我最喜欢这个解决方案,空间换时间的算法
045 对这个问题属于 过度优化
046 """
047 return ((i, j, k, l)
048 for i in r10
049 for j in r10
050 for k in r10
051 for l in r10
052 if( i != j and i != k and i != l and j != k and j != l and k != l) )
053 timing(init_set10, 1000)
054
055 def init_set11():
056 """
057 用代码的空间代价换取计算P4_4的时间
058 init_set11 1000 times 7.268 OMG
059 reduce(lambda x,y:x+y,l)太慢了
060 """
061 c10_4=[( i, j, k, l ) for i in xrange(0, 10)
062 for j in xrange(i+1, 10)
063 for k in xrange(j+1, 10)
064 for l in xrange(k+1, 10) ]
065
066 ret=reduce(lambda x,y:x+y,
067 [ [ (i, j, k, l),
068 (i, j, l, k),
069 (i, k, j, l),
070 (i, k, l, j),
071 (i, l, j, k),
072 (i, l, k, j),
073 (j, i, k, l),
074 (j, i, l, k),
075 (j, k, i, l),
076 (j, k, l, i),
077 (j, l, i, k),
078 (j, l, k, i),
079 (k, i, j, l),
080 (k, i, l, j),
081 (k, j, i, l),
082 (k, j, l, i),
083 (k, l, i, j),
084 (k, l, j, i),
085 (l, i, j, k),
086 (l, i, k, j),
087 (l, j, i, k),
088 (l, j, k, i),
089 (l, k, i, j),
090 (l, k, j, i),]
091 for i, j, k, l in c10_4 ],
092 )
093 return ret
094
095 def init_set12():
096 """
097 generator是伟大的发明,数据流编程万岁
098 init_set12 1000 times 1.758
099 """
100 c10_4=(( i, j, k, l ) for i in xrange(0, 10)
101 for j in xrange(i+1, 10)
102 for k in xrange(j+1, 10)
103 for l in xrange(k+1, 10) )
104
105 from itertools import chain
106 ret=chain(
107 *( ( (i, j, k, l),
108 (i, j, l, k),
109 (i, k, j, l),
110 (i, k, l, j),
111 (i, l, j, k),
112 (i, l, k, j),
113 (j, i, k, l),
114 (j, i, l, k),
115 (j, k, i, l),
116 (j, k, l, i),
117 (j, l, i, k),
118 (j, l, k, i),
119 (k, i, j, l),
120 (k, i, l, j),
121 (k, j, i, l),
122 (k, j, l, i),
123 (k, l, i, j),
124 (k, l, j, i),
125 (l, i, j, k),
126 (l, i, k, j),
127 (l, j, i, k),
128 (l, j, k, i),
129 (l, k, i, j),
130 (l, k, j, i),)
131 for i, j, k, l in c10_4 )
132 )
133 return list(ret)
134 timing(init_set12, 1000)
002 #关于这个问题的精彩讨论参见这里
003 # http://groups.google.com/group/python-cn/browse_thread/thread/4d9eda8e422a6cf8
004
005 #在我的电脑上
006 #init_set 1000 times 5.529
007 #init_set2 1000 times 4.674
008 #init_set3 1000 times 3.287
009 #init_set4 1000 times 18.271
010 #init_set5 1000 times 2.069
011
012 def init_set8(r10=range(10)):
013 """
014 把循环内的range函数提到外面
015 times5.486 ==> 4.427
016 """
017 ret = []
018 for i in r10:
019 for j in r10:
020 for k in r10:
021 for l in r10:
022 if i != j and i != k and i != l and j != k and j != l and k != l:
023 ret.append((i, j, k, l))
024 return ret
025 timing(init_set8, 1000)
026 def init_set9(r10=range(10)):
027 """
028 for 循环改成列表推导
029 times5.486 ==>3.773
030 """
031 return [(i, j, k, l)
032 for i in r10
033 for j in r10
034 for k in r10
035 for l in r10
036 if ( i != j and i != k and i != l and j != k and j != l and k != l) ]
037 timing(init_set9, 1000)
038
039 def init_set10(r10=range(10)):
040 """
041 return 一个 generator
042 init_set10 1000 times 0.004
043 这个无疑是最快的 :P
044 我最喜欢这个解决方案,空间换时间的算法
045 对这个问题属于 过度优化
046 """
047 return ((i, j, k, l)
048 for i in r10
049 for j in r10
050 for k in r10
051 for l in r10
052 if( i != j and i != k and i != l and j != k and j != l and k != l) )
053 timing(init_set10, 1000)
054
055 def init_set11():
056 """
057 用代码的空间代价换取计算P4_4的时间
058 init_set11 1000 times 7.268 OMG
059 reduce(lambda x,y:x+y,l)太慢了
060 """
061 c10_4=[( i, j, k, l ) for i in xrange(0, 10)
062 for j in xrange(i+1, 10)
063 for k in xrange(j+1, 10)
064 for l in xrange(k+1, 10) ]
065
066 ret=reduce(lambda x,y:x+y,
067 [ [ (i, j, k, l),
068 (i, j, l, k),
069 (i, k, j, l),
070 (i, k, l, j),
071 (i, l, j, k),
072 (i, l, k, j),
073 (j, i, k, l),
074 (j, i, l, k),
075 (j, k, i, l),
076 (j, k, l, i),
077 (j, l, i, k),
078 (j, l, k, i),
079 (k, i, j, l),
080 (k, i, l, j),
081 (k, j, i, l),
082 (k, j, l, i),
083 (k, l, i, j),
084 (k, l, j, i),
085 (l, i, j, k),
086 (l, i, k, j),
087 (l, j, i, k),
088 (l, j, k, i),
089 (l, k, i, j),
090 (l, k, j, i),]
091 for i, j, k, l in c10_4 ],
092 )
093 return ret
094
095 def init_set12():
096 """
097 generator是伟大的发明,数据流编程万岁
098 init_set12 1000 times 1.758
099 """
100 c10_4=(( i, j, k, l ) for i in xrange(0, 10)
101 for j in xrange(i+1, 10)
102 for k in xrange(j+1, 10)
103 for l in xrange(k+1, 10) )
104
105 from itertools import chain
106 ret=chain(
107 *( ( (i, j, k, l),
108 (i, j, l, k),
109 (i, k, j, l),
110 (i, k, l, j),
111 (i, l, j, k),
112 (i, l, k, j),
113 (j, i, k, l),
114 (j, i, l, k),
115 (j, k, i, l),
116 (j, k, l, i),
117 (j, l, i, k),
118 (j, l, k, i),
119 (k, i, j, l),
120 (k, i, l, j),
121 (k, j, i, l),
122 (k, j, l, i),
123 (k, l, i, j),
124 (k, l, j, i),
125 (l, i, j, k),
126 (l, i, k, j),
127 (l, j, i, k),
128 (l, j, k, i),
129 (l, k, i, j),
130 (l, k, j, i),)
131 for i, j, k, l in c10_4 )
132 )
133 return list(ret)
134 timing(init_set12, 1000)
所有评论,共5条:( 我也来说两句)
| 1 |
半瓶墨水
5个月前
回复
抛砖引玉引来了流星火雨,OMG!
|
| 2 |
其实我想在Gmail上贴彩色代码
|
| 3 |
直接copy & Paste不行吗?我都是这么干的,Gmail是可以的啊。
|
| 4 |
能够给这个代码加上“猜数字”标签吗?
|
| 5 |
试试URL的显示:
|
代码