我正在进行 AJAX 调用,并在其中传递变量pub
,可能是1
或0
。
作为一名初学者,我希望对进入的变量类型有双重肯定。我知道我可以很容易地转换为int()
,问题实际上不是AJAX结果,而是导致了这个问题。
我的代码:
if pub == 1 or pub == '1':
#execute funcA()
但上面对我来说不是那么pythonic所以我试过了:
if pub in [1,'1']:
#execute funcA()
以上哪个代码更好:
答案 0 :(得分:12)
效果:in in better
timeit.timeit("pub='1'; pub == 1 or pub == '1'")
0.07568907737731934
timeit.timeit("pub='1'; pub in[1, '1']")
0.04272890090942383
timeit.timeit("pub=1; pub == 1 or pub == '1'")
0.07502007484436035
timeit.timeit("pub=1; pub in[1, '1']")
0.07035684585571289
#other options
timeit.timeit("pub='1'; pub in (1,'1')")
0.04643988609313965
timeit.timeit("pub='1'; pub in {1,'1'}")
0.17076611518859863
timeit.timeit("pub=1; pub in (1,'1')")
0.047419071197509766
timeit.timeit("pub=1; pub in {1,'1'}")
0.1770930290222168
所以,{} > or > [] > ()
基于效果。
练习:首选in
,因为输入的内容较少。基于练习,(), [], {}
同样优秀
<强>内存强>:
sys.getsizeof([1,"1"])
88
sys.getsizeof("1",1)
38
#other options
sys.getsizeof(("1",1))
72
sys.getsizeof({"1",1})
232
所以,{} > [] > () > or
基于记忆
虽然没有被问到,但很高兴知道:
功能:值相等而不是引用相等
in
只是顺序检查等式==
。如此相似。 in
使用==
而非is
。
我的意思是:
>>> a = [1,2,3]
>>> b = [1,a]
>>> b
[1, [1, 2, 3]]
>>> 1 in b
True
>>> a in b
True
>>> [1,2,3] in b
True
所以它实现了不:
>>> for i in b:
... print [1,2,3] is i
...
False
False
如果两个变量指向同一个对象,则{p> is
将返回True,如果变量引用的对象相等,则返回==
。 in
使用==
答案 1 :(得分:7)
此代码更好
if pub in [1,'1']:
#execute funcA()
因为它稍微快一点,但主要是因为它不冗余。变量pub
只出现一次。
答案 2 :(得分:3)
因此,明智的表现in
更好:
timeit.timeit("pub='1'; pub == 1 or pub == '1'")
0.16224503758795805
timeit.timeit("pub='1'; pub in[1, '1']")
0.13723585976354258
timeit.timeit("pub=1; pub == 1 or pub == '1'")
0.07986264585216674
timeit.timeit("pub=1; pub in[1, '1']")
0.07246544186018866
根据内存空间,if
更好,因为list使用更多的内存
sys.getsizeof([1,"1"])
44
sys.getsizeof(1)
12
sys.getsizeof("1")
22
sys.getsizeof("1",1)
22
这是因为即使创建空列表也会占用内存空间
sys.getsizeof([])
36
我不知道best practice aspect
对我来说,最pythonic的方法是使用in
,因为它减少了输入
答案 3 :(得分:1)
<强> 1。性能强>
>>> timeit.timeit("pub=1; pub == 1 or pub == '1'", number=10000)
0.0017161369323730469
>>> timeit.timeit("pub=1; pub in[1, '1']", number=10000)
0.0013611316680908203
<强> 2。最佳实践: 以我喜欢的pythonic方式编写程序是很好的([1,&#39; 1&#39;]中的pub)
第3。内存使用: 数字1和字符串&#39; 1&#39;总是在python中缓存,您可以验证这些对象的引用计数。理想情况下,它不会占用任何额外的记忆。
>>> sys.getrefcount(1)
833
>>> sys.getrefcount('1')
16
如果使用需要分配更多内存的列表来引用这些缓存对象。 (以下是64位类型)
>>> sys.getsizeof([1, '1'])
88
这些88字节的内存比其他方式分配得更多。
我建议你选择:
if pub in [1,'1']:
#execute funcA()
答案 4 :(得分:0)
速度:
in
更快更快
为了证明这一点,这是代码。
from datetime import datetime
start0 = datetime.now()
pub = 1
if pub == 1 or pub == '1':
# execute funcA()
pass
end0 = datetime.now() - start0
print end0
start1 = datetime.now()
if pub in [1, '1']:
# execute funcA()
pass
end1 = datetime.now() - start1
print end1
print end0 - end1
输出:
0:00:00.000045
0:00:00.000007
0:00:00.000038
在太空中:
==
好多了
in
占用O(2)空间,而==
占用O(1)空间
据我所知,最佳做法是使用in
,因为速度快得多,节省了很多打字
答案 5 :(得分:0)
不是真的。如果您切换顺序,您会看到不同的结果,只需将顺序放在下面:
pub = 1
if pub in [1, '1']:
# execute funcA()
pass
end1 = datetime.now() - start1
print end1
print end0 - end1
start0 = datetime.now()
if pub == 1 or pub == '1':
# execute funcA()
pass
end0 = datetime.now() - start0
print end0
start1 = datetime.now()