Python中的vs ==。在这种情况下使用哪种?

时间:2015-07-15 05:38:36

标签: python

我正在进行 AJAX 调用,并在其中传递变量pub,可能是10

作为一名初学者,我希望对进入的变量类型有双重肯定。我知道我可以很容易地转换为int(),问题实际上不是AJAX结果,而是导致了这个问题。

我的代码:

if pub == 1 or pub == '1':
    #execute funcA()

但上面对我来说不是那么pythonic所以我试过了:

if pub in [1,'1']:
    #execute funcA()

以上哪个代码更好:

  1. 性能(速度)。
  2. 最佳实践。
  3. 内存使用情况。

6 个答案:

答案 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()