小编max*_*max的帖子

对相同对象的慢等式评估(x == x)

有没有什么理由x == x不能快速评估?我希望__eq__能检查它的两个参数是否相同,如果是,则立即返回True.但它没有这样做:

s = set(range(100000000))
s == s # this doesn't short-circuit, so takes ~1 sec
Run Code Online (Sandbox Code Playgroud)

对于内置插件,x == x总是返回True我认为?对于用户定义的类,我想有人可能会定义__eq__不满足此属性,但是有没有合理的用例呢?

我想之所以x == x能够快速评估是因为它是在一个巨大的性能损失非常大的参数memoizing功能:

from functools import lru_cache
@lru_cache()
def f(s):
    return sum(s)
large_obj = frozenset(range(50000000))
f(large_obj) # this takes >1 sec every time
Run Code Online (Sandbox Code Playgroud)

请注意,@ lru_cache 对大型对象反复慢的原因并不是因为它需要计算__hash__(这只是执行一次然后由@jsbueno 指出的硬缓存),但因为__eq__ 每次都需要执行字典的哈希表确保它在桶中找到正确的对象(哈希的相等性显然是不够的).

更新:

对于三种情况,似乎值得分别考虑这个问题.

1)用户定义的类型(即,不是内置/标准库).

正如@donkopotamus指出的那样,有些情况下x == x不应该评估为True.例如,for numpy.arraypandas.Seriestypes,结果有意无法转换为boolean,因为它不清楚自然语义应该是什么(False意味着容器是空的,还是意味着它中的所有项都是False?).

但是在这里,python不需要做任何事情,因为 …

python python-3.x python-internals

15
推荐指数
1
解决办法
273
查看次数

python 3.3+中__init__.py的用例

现在__init__.py不再需要做出公认的软件包的目录,这是为了避免他们完全可能的话最好的做法?或者__init__.py在python 3.3+中仍有广为接受的用例?

根据我的理解,__init__.py非常常用于在模块导入时运行代码(例如,封装包的内部文件结构或执行一些初始化步骤).这些用例是否仍与python 3.3+相关?

python module python-3.x

15
推荐指数
1
解决办法
1712
查看次数

有可能告诉Github我的分支被合并到上游主人吗?

我使用我的本地分支feature为github仓库创建一个PR(我没有写入权限).后来我决定将其最后一次提交分成独立的PR,所以我将feature一个提交移回:

git checkout feature
git branch feature2
git reset --hard @~
git push -f
Run Code Online (Sandbox Code Playgroud)

第一个PR合并到上游,所以现在我要创建第二个PR:

git checkout master
git pull upstream master
git push origin
git checkout feature2
git rebase master
Run Code Online (Sandbox Code Playgroud)

不幸的是,事实证明git缺乏feature合并的信息master.因此,它没有意识到最近的共同基础feature2并且master非常接近:它只是feature.相反,它rebase一直回到共同基础,feature并且master好像它们从未合并过一样.结果,git rebase master变得不必要地混乱.

为什么Github失去通过上游PR feature合并的信息master?有没有办法提供Github这些信息?

最后,我不得不诉诸:

git checkout master
git checkout -b feature2_new
git cherry-pick feature2
Run Code Online (Sandbox Code Playgroud)

幸运的是,我只需要处理一次提交.甚至与单个提交,我认为这与真正的基础(如果混帐知道这件事),合并会优于cherry-pick …

git github git-workflow

15
推荐指数
2
解决办法
372
查看次数

了解zip功能

所有讨论都是关于python 3.1.2; 请参阅Python文档以获取我的问题的来源.

我知道什么zip呢; 我只是不明白为什么它可以像这样实现:

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    iterables = map(iter, iterables)
    while iterables:
        yield tuple(map(next, iterables))
Run Code Online (Sandbox Code Playgroud)

比方说我打电话zip(c1, c2, c3).如果我理解正确,iterables最初是元组(c1,c2,c3).

该行将其iterables = map(iter, iterables)转换为迭代器,如果迭代,它将返回iter(c1),iter(c2),iter(c3).

在循环中,map(next, iterables)是会返回一个迭代器next(iter(c1)),next(iter(c2))以及next(iter(c3))如果通过迭代.的tuple通话将其转换为(next(iter(c1)), next(iter(c2)), next(iter(c3)),用尽其参数(iterables据我可以告诉在第一个调用).我不明白while循环如何继续,因为它检查iterables; 如果它继续,为什么tuple调用不返回空元组(迭代器耗尽).

我确定我错过了很简单的东西..

python zip iterator python-3.x

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

抑制字符串处理为可迭代

更新:

2006年在python.org上提出了使内置字符串不可迭代的想法.我的问题不同之处在于我试图偶尔禁止这个功能; 仍然这整个线程非常相关.

以下是Guido的批评意见,他们str在试验基础上实施了不可迭代的评论:

[...]我实现了这个(这很简单)然后发现我必须修复大量遍布字符串的地方.例如:

  • sre解析器和编译器使用set("0123456789")之类的东西,并迭代输入regexp的字符来解析它.

  • difflib有两个字符串列表定义的API(文件的典型逐行差异),或两个字符串(典型的行内差异),甚至两个任何列表(对于广义序列差异) .

  • optparse.py,textwrap.py,string.py中的小变化.

而且我甚至还没有在regrtest.py框架工作的地方(由于difflib问题).

我放弃了这个项目; 补丁是SF补丁1471291.我不再赞成这个想法; 它只是不实用,而且我在sre和difflib中找到的用例都反驳了迭代字符串的好理由的前提.

原始问题:

虽然字符串的一个简洁功能是字符串是可迭代的,但当与鸭子打字相结合时,它可能会导致灾难:

# record has to support [] operation to set/retrieve values
# fields has to be an iterable that contains the fields to be set
def set_fields(record, fields, value):
  for f in fields:
    record[f] = value

set_fields(weapon1, ('Name', 'ShortName'), 'Dagger')
set_fields(weapon2, ('Name',), 'Katana')
set_fields(weapon3, 'Name', 'Wand') # I was tired and forgot to put parentheses
Run Code Online (Sandbox Code Playgroud)

除了isinstance(fields, …

python string iterable python-3.x

14
推荐指数
2
解决办法
5033
查看次数

开发一种启发式方法来测试简单的匿名Python函数的等价性

我知道函数比较在Python 3中是如何工作的(只是比较内存中的地址),我理解为什么.

我也理解"真正的"比较(对于任何参数,给定相同参数的函数fg返回相同的结果吗?)实际上是不可能的.

我正在寻找介于两者之间的东西.我希望比较能够处理相同函数的最简单的情况,并且可能是一些不那么简单的函数:

lambda x : x == lambda x : x # True
lambda x : 2 * x == lambda y : 2 * y # True
lambda x : 2 * x == lambda x : x * 2 # True or False is fine, but must be stable
lambda x : 2 * x == lambda x : x + x # True or False is fine, but must be stable …
Run Code Online (Sandbox Code Playgroud)

python bytecode function python-3.x

14
推荐指数
2
解决办法
1380
查看次数

文件名与文件对象作为函数参数

如果一个函数将文本文件的名称作为输入,我可以将其重构为一个文件对象(我称之为"流";是否有更好的词?).优点显而易见 - 将流作为参数的函数是:

  • 因为我不需要为测试创建临时文件,所以更容易编写单元测试
  • 更灵活,因为我可以在我以某种方式已经在变量中具有文件内容的情况下使用它

流有什么不利之处吗?或者我应该始终将函数从文件名参数重构为流参数(当然,假设文件是​​纯文本的)?

python unit-testing arguments software-design python-3.x

14
推荐指数
2
解决办法
3386
查看次数

使用局部加权回归(LOESS/LOWESS)预测新数据

如何在python中拟合局部加权回归,以便它可用于预测新数据?

statsmodels.nonparametric.smoothers_lowess.lowess,但它仅返回原始数据集的估计值; 如此看来只做fitpredict在一起,而不是单独作为我的预期.

scikit-learn总是有一个fit方法允许稍后在新数据上使用该对象predict; 但它没有实现lowess.

python python-3.x pandas statsmodels

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

Spark DataFrames中的argmax:如何检索具有最大值的行

给定Spark DataFrame df,我想在某个数字列中找到最大值'values',并获得达到该值的行.我当然可以这样做:

# it doesn't matter if I use scala or python, 
# since I hope I get this done with DataFrame API
import pyspark.sql.functions as F
max_value = df.select(F.max('values')).collect()[0][0]
df.filter(df.values == max_value).show()
Run Code Online (Sandbox Code Playgroud)

但这是低效的,因为它需要两次通过df.

pandas.Series/ DataFrame并且/ numpy.arrayargmax/ idxmax有效地执行此操作的方法(一次通过).标准python也是如此(内置函数max接受一个关键参数,因此它可用于查找最高值的索引).

Spark的正确方法是什么?请注意,我不介意我是否获得了达到最大值的所有行,或者只是获得了那些行的任意(非空!)子集.

apache-spark apache-spark-sql

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

__del__的用例

在python 3中编写自定义__del__方法或依赖stdlib 1中的一个用例是什么?也就是说,在什么情况下它是相当安全的,并且可以做一些没有它的事情很难做到的事情?

出于很多好的理由(1 2 3 4 5 6),通常的建议是避免__del__使用上下文管理器或手动执行清理:

  1. __del__如果对象在intrepreter出口2上处于活动状态,则不保证会被调用.
  2. 在点1期望对象可以被破坏时,引用计数实际上可以是非零的(例如,引用可以通过由调用函数保持的回溯帧而存活).这使得破坏时间远比仅仅gc暗示的不可预测性更不确定.
  3. 垃圾收集器如果包含多个对象,则无法摆脱循环 __del__
  4. 内部代码__del__必须仔细编写:
    • 设置的对象属性__init__可能不存在,因为__init__可能引发了异常;
    • 异常被忽略(仅打印到stderr);
    • 全局变量可能不再可用.

更新:

PEP 442在行为上做出了重大改进__del__.虽然我的第1-4点仍然有效?


更新2:

一些顶级的python库包含__del__在后PEP 442 python(即python 3.4+)中的使用.我想我的观点3在PEP 442之后不再有效,其他点被接受为对象终结的不可避免的复杂性.


1我将问题从编写自定义__del__方法扩展到包括依赖于__del__stdlib.

2似乎__del__总是在更新版本的Cpython中调用解释器退出(有没有人有反例?).然而,对于__del__可用性的目的并不重要:文档明确地不提供对此行为的保证,因此不能依赖它(它可能在将来的版本中发生变化,在非CPython解释器中可能会有所不同) .

python destructor python-3.x

14
推荐指数
2
解决办法
896
查看次数