我需要以下功能:
输入:alist
输出:
True 如果输入列表中的所有元素使用标准相等运算符评估为彼此相等; False 除此以外.性能:当然,我不希望招致任何不必要的开销.
我觉得最好是:
AND所有结果布尔值但我不确定最恐怖的方式是什么.
编辑:
谢谢你所有的好答案.我评价了几个,而且很难在@KennyTM和@Ivo van der Wijk解决方案之间做出选择.
缺少短路功能只会对早期具有不相等元素的长输入(超过约50个元素)造成伤害.如果这种情况经常发生(通常取决于列表的长度),则需要进行短路.最好的短路算法似乎是@KennyTM checkEqual1.然而,它为此付出了巨大的代价:
如果早期不等元素的长输入没有发生(或很少发生),则不需要短路.然后,到目前为止最快的是@Ivo van der Wijk解决方案.
我需要创建一个长度为NumPy的数组n,其中每个元素都是v.
还有什么比:
a = empty(n)
for i in range(n):
a[i] = v
Run Code Online (Sandbox Code Playgroud)
我知道zeros和ones会的工作为V = 0,1,我可以使用v * ones(n),但是当它不会工作v的None,而且也将是慢得多.
相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?
我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.
IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.
作为一个练习,主要是为了我自己的娱乐,我正在实现一个回溯包装解析器.对此的灵感是我想更好地了解hygenic宏如何在类似algol的语言中工作(与你通常在其中找到的语法免费lisp方言相对应).因此,通过输入的不同传递可能会看到不同的语法,因此缓存的解析结果无效,除非我还存储语法的当前版本以及缓存的解析结果.(编辑:使用键值集合的结果是它们应该是不可变的,但我不打算公开接口以允许它们被更改,因此可变或不可变集合都可以)
问题是python dicts不能作为其他dicts的键.即使使用元组(正如我将要做的那样)也无济于事.
>>> cache = {}
>>> rule = {"foo":"bar"}
>>> cache[(rule, "baz")] = "quux"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
Run Code Online (Sandbox Code Playgroud)
我想它必须一直是元组.现在python标准库提供了我所需要的,collections.namedtuple具有非常不同的语法,但可以用作键.继续上述会议:
>>> from collections import namedtuple
>>> Rule = namedtuple("Rule",rule.keys())
>>> cache[(Rule(**rule), "baz")] = "quux"
>>> cache
{(Rule(foo='bar'), 'baz'): 'quux'}
Run Code Online (Sandbox Code Playgroud)
好.但是我必须为我想要使用的规则中的每个可能的键组合创建一个类,这不是那么糟糕,因为每个解析规则确切地知道它使用了什么参数,因此可以同时定义该类作为解析规则的函数.
编辑:namedtuples 的另一个问题是它们是严格定位的.两个看起来应该不同的元组实际上可以是相同的:
>>> you = namedtuple("foo",["bar","baz"])
>>> me = namedtuple("foo",["bar","quux"])
>>> you(bar=1,baz=2) == me(bar=1,quux=2)
True
>>> bob = namedtuple("foo",["baz","bar"]) …Run Code Online (Sandbox Code Playgroud) 是否有关于哪些内置和标准库类不可子类化("最终")的规则?
从Python 3.3开始,这里有几个例子:
boolfunctionoperator.itemgetterslice我发现了一个问题,它涉及C语言和纯Python中"final"类的实现.
我想了解是什么原因可以解释为什么一个班级被选为首选的"最终".
max(float('nan'), 1) 评估为nan
max(1, float('nan')) 评估为1
这是预期的行为吗?
谢谢你的回答.
max当iterable为空时引发异常.为什么Python max在nan出现时不会引发异常?或者至少做一些有用的事情,比如回归nan或忽略nan.目前的行为非常不安全,似乎完全不合理.
我发现这种行为更令人惊讶的结果,所以我刚发布了一个相关的问题.
注意:虽然接受的答案达到了我想要的结果,并且@ecatmur答案提供了更全面的选项,但我觉得强调我的用例首先是一个坏主意是非常重要的.这在@Jason Orendorff的答案中得到了很好的解释.
注意:这个问题不是关于的问题sys.maxint的重复.它与此无关sys.maxint; 即使在sys.maxint可用的python 2中,它也不代表最大整数(参见接受的答案).
我需要创建一个比任何其他整数都大的整数,这意味着一个int对象True在与任何其他int对象相比时返回>.用例:库函数需要一个整数,强制某种行为的唯一简单方法是传递一个非常大的整数.
在python 2中,我可以使用sys.maxint(编辑:我错了).在python 3中,math.inf是最接近的等价物,但我无法将其转换为int.
[Python 3.1]
我在python的输出中遇到负零; 它的创建举例如下:
k = 0.0
print(-k)
Run Code Online (Sandbox Code Playgroud)
输出将是-0.0.
但是,当我将-k0.0 比较为相等时,它会产生True.有什么区别0.0和-0.0(我不在乎他们可能有不同的内部表示.我只关心自己的程序中的行为)是否有任何隐藏的陷阱我应该知道的?
我为以下代码得到了非常奇怪的时间:
import numpy as np
s = 0
for i in range(10000000):
s += np.float64(1) # replace with np.float32 and built-in float
Run Code Online (Sandbox Code Playgroud)
为什么float64比两倍慢float?为什么float32比float64慢5倍?
有没有办法避免使用的惩罚np.float64,并有numpy功能返回内置float而不是float64?
我发现使用numpy.float64比Python的浮点慢得多,numpy.float32甚至更慢(即使我在32位机器上).
numpy.float32在我的32位机器上.因此,每次我使用各种numpy函数时numpy.random.uniform,我将结果转换为float32(以便以32位精度执行进一步的操作).
有没有办法在程序或命令行中的某处设置单个变量,并使所有numpy函数返回float32而不是float64?
编辑#1:
在算术计算中,numpy.float64 比浮点慢10倍.它非常糟糕,甚至在计算之前转换为浮动和返回使程序运行速度提高了3倍.为什么?我能做些什么来解决它吗?
我想强调一下,我的时间安排不是由以下任何原因引起的:
我更新了我的代码,以便更清楚地解决问题所在.使用新代码,我发现使用numpy数据类型可以看到十倍的性能:
from datetime import datetime
import numpy as np
START_TIME = …Run Code Online (Sandbox Code Playgroud) 我很惊讶这个断言失败了:
x = 42
x = lambda: x
assert x() == 42
Run Code Online (Sandbox Code Playgroud)
似乎x结束了递归指本身,这样x(),x()()等都是功能。
用于解析它的规则是什么,它记录在哪里?
顺便说一句(不出乎意料地给出了上面的内容), 的原始值x在 lambda 定义之后没有引用:
class X:
def __del__(self): print('deleting')
x = X()
x = lambda: x # 'deleting' is printed here
Run Code Online (Sandbox Code Playgroud) python ×9
comparison ×2
numpy ×2
python-3.x ×2
algorithm ×1
arrays ×1
class ×1
ieee-754 ×1
infinity ×1
inheritance ×1
math ×1
nan ×1
performance ×1
zero ×1