小编max*_*max的帖子

检查列表中的所有元素是否相同

我需要以下功能:

输入:alist

输出:

  • True 如果输入列表中的所有元素使用标准相等运算符评估为彼此相等;
  • False 除此以外.

性能:当然,我不希望招致任何不必要的开销.

我觉得最好是:

  • 遍历列表
  • 比较相邻元素
  • 以及AND所有结果布尔值

但我不确定最恐怖的方式是什么.


编辑:

谢谢你所有的好答案.我评价了几个,而且很难在@KennyTM和@Ivo van der Wijk解决方案之间做出选择.

缺少短路功能只会对早期具有不相等元素的长输入(超过约50个元素)造成伤害.如果这种情况经常发生(通常取决于列表的长度),则需要进行短路.最好的短路算法似乎是@KennyTM checkEqual1.然而,它为此付出了巨大的代价:

  • 高达20倍的性能几乎相同的列表
  • 短名单上的表现高达2.5倍

如果早期不等元素的长输入没有发生(或很少发生),则不需要短路.然后,到目前为止最快的是@Ivo van der Wijk解决方案.

python algorithm comparison

351
推荐指数
10
解决办法
28万
查看次数

NumPy数组初始化(填充相同的值)

我需要创建一个长度为NumPy的数组n,其中每个元素都是v.

还有什么比:

a = empty(n)
for i in range(n):
    a[i] = v
Run Code Online (Sandbox Code Playgroud)

我知道zerosones会的工作为V = 0,1,我可以使用v * ones(n),但是当它不会工作vNone,而且也将是慢得多.

python arrays numpy

205
推荐指数
7
解决办法
27万
查看次数

为什么NaN不等于NaN?

相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?

我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.

IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.

language-agnostic floating-point nan ieee-754

114
推荐指数
5
解决办法
3万
查看次数

Python hashable dicts

作为一个练习,主要是为了我自己的娱乐,我正在实现一个回溯包装解析器.对此的灵感是我想更好地了解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

79
推荐指数
7
解决办法
5万
查看次数

哪些类不能被子类化?

是否有关于哪些内置和标准库类不可子类化("最终")的规则?

从Python 3.3开始,这里有几个例子:

  • bool
  • function
  • operator.itemgetter
  • slice

我发现了一个问题,它涉及C语言和纯Python中"final"类的实现.

我想了解是什么原因可以解释为什么一个班级被选为首选的"最终".

python inheritance language-design class python-3.x

71
推荐指数
1
解决办法
6247
查看次数

Python:max/min内置函数取决于参数顺序

max(float('nan'), 1) 评估为nan

max(1, float('nan')) 评估为1

这是预期的行为吗?


谢谢你的回答.

max当iterable为空时引发异常.为什么Python maxnan出现时不会引发异常?或者至少做一些有用的事情,比如回归nan或忽略nan.目前的行为非常不安全,似乎完全不合理.

我发现这种行为更令人惊讶的结果,所以我刚发布了一个相关的问题.

python math comparison

50
推荐指数
2
解决办法
3万
查看次数

如何使整数大于任何其他整数?

注意:虽然接受的答案达到了我想要的结果,并且@ecatmur答案提供了更全面的选项,但我觉得强调我的用例首先是一个坏主意是非常重要的.这在@Jason Orendorff的答案中得到了很好的解释.

注意:这个问题不是关于的问题sys.maxint的重复.它与此无关sys.maxint; 即使在sys.maxint可用的python 2中,它也不代表最大整数(参见接受的答案).

我需要创建一个比任何其他整数都大的整数,这意味着一个int对象True在与任何其他int对象相比时返回>.用例:库函数需要一个整数,强制某种行为的唯一简单方法是传递一个非常大的整数.

在python 2中,我可以使用sys.maxint(编辑:我错了).在python 3中,math.inf是最接近的等价物,但我无法将其转换为int.

python infinity python-3.x

50
推荐指数
3
解决办法
7370
查看次数

python中的负零

[Python 3.1]

我在python的输出中遇到负零; 它的创建举例如下:

k = 0.0
print(-k)
Run Code Online (Sandbox Code Playgroud)

输出将是-0.0.

但是,当我将-k0.0 比较为相等时,它会产生True.有什么区别0.0-0.0(我不在乎他们可能有不同的内部表示.我只关心自己的程序中的行为)是否有任何隐藏的陷阱我应该知道的?

python floating-point floating-accuracy zero

47
推荐指数
4
解决办法
2万
查看次数

numpy float:比算术运算中的内置慢10倍?

我为以下代码得到了非常奇怪的时间:

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)
  • 内置浮子:4.9秒
  • float64:10.5 s
  • float32:45.0 s

为什么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和python float之间的转换
  • 对象的创建

我更新了我的代码,以便更清楚地解决问题所在.使用新代码,我发现使用numpy数据类型可以看到十倍的性能:

from datetime import datetime
import numpy as np

START_TIME = …
Run Code Online (Sandbox Code Playgroud)

python floating-point performance numpy

47
推荐指数
5
解决办法
1万
查看次数

`x = 42 是怎么回事;x = lambda: x` 解析了吗?

我很惊讶这个断言失败了:

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 language-lawyer

47
推荐指数
3
解决办法
2772
查看次数