我想让'=='运算符在我的程序中使用近似比较:浮点值x和y相等(==)if
abs(x-y)/(0.5(x+y)) < 0.001
Run Code Online (Sandbox Code Playgroud)
有什么好办法呢?鉴于float是一个内置类型,我不认为我可以重新定义==运算符,是吗?
请注意,我想使用float的其他功能,我唯一想改变的是等于运算符.
编辑:
感谢您的回答,我理解您关于可读性和其他问题的论点.
也就是说,如果可能的话,我真的更希望实际使用常规浮点类型,而不是使用新类或新的比较函数.是否有可能重新定义==运算符的常规浮点数?
我的理由是::
(a)每个使用我正在编写的程序的人都希望以这种方式比较浮点数
(b)世界上没有办法让任何人想要使用默认的==浮点数.为什么它甚至在语言中?
(c)我不喜欢代码中的额外词语; 显然使用现有的float会导致代码没有任何变化
编辑2.
既然我知道我不能重载浮动的==运算符,我必须改变我的问题.它将变得如此不同,我将在内置容器的自定义比较中创建一个新的
我正在运行一个执行简单数据处理的程序:
该程序仅使用CPU,RAM和HDD:
运行相同的程序:
CPU的频率是1.44,硬盘的基准分数是4倍(Passmark - Disk Mark).我发现程序在桌面上的运行速度只有1.66倍.显然,CPU是瓶颈.
似乎i7 Core与Intel Core2 Duo架构只有15%的好处(大部分性能提升都归功于直接的CPU频率).我可以在代码中做些什么来增加新架构的好处吗?
编辑:忘记提及我使用ActivePython 3.1.2如果这很重要.
我注意到我的(纯Python)代码的很大一部分处理表.当然,我class Table支持基本功能,但我最终添加了越来越多的功能,如查询,验证,排序,索引等.
我想知道删除我是否是一个好主意class Table,并重构代码以使用我将在内存中实例化的常规关系数据库.
这是我到目前为止的想法:
查询和索引的性能会提高,但Python代码和单独的数据库进程之间的通信可能比Python函数之间的效率低.我认为这是太多的开销,所以我不得不使用Python附带的sqlite并且生活在同一个进程中.我希望这意味着它是纯粹的性能提升(以非标准SQL定义和sqlite的有限功能为代价).
使用SQL,我将获得比我自己想要的更强大的功能.看起来像一个明显的优势(即使使用sqlite).
我不需要调试我自己的表实现,但是SQL中的调试错误很难,因为我不能放置断点或者很容易打印出临时状态.我不知道如何判断代码可靠性和调试时间的整体影响.
代码将更容易阅读,因为我不会调用自己的自定义方法而是编写SQL(每个需要维护此代码的人都知道SQL).但是,处理数据库的Python代码可能比使用纯Python的代码更加丑陋和复杂class Table.同样,我不知道哪个更好平衡.
对上述内容的任何更正,或者我应该考虑的任何其他内容?
据我所知,类的每个实例都存储对实例方法的引用.
我认为,从概念上讲,类的所有实例都具有相同的实例方法.如果是这样,内存节省和逻辑清晰度似乎都表明实例方法应该存储在类对象而不是实例对象中(实例对象通过类对象查找它们;当然,每个实例都有一个对它的引用类).为什么不这样做?
第二个问题.为什么实例方法不能以类似于实例属性的方式访问,即通过__dict__或通过其他系统属性?有没有办法查看(也许更改)名称和实例方法的引用?
编辑:
哎呀,对不起.我完全错了.我看到了以下Python 2代码,并错误地从中得出结论,实例方法存储在实例中.我不确定它是做什么的,因为我不使用Python 2,并且new已经从Python 3中消失了.
import new
class X(object):
def f(self):
print 'f'
a = X()
b = X()
def g(self):
print 'g'
# I thought this modified instance method just in a, not in b
X.f = new.instancemethod(g, a, X)
Run Code Online (Sandbox Code Playgroud) 引用计数达到零后多久被__del__调用的方法?语言是否承诺在任何其他使用代码执行之前立即完成?或者每个实现可以做自己喜欢的事情,可能会将呼叫延迟到__del__任意长时间?
程序即将退出时请忽略这种情况(我认为这意味着给定块中的最后一个语句已经完成,并且堆栈为空).我明白在这种情况下,没有任何承诺__del__; 甚至根本不需要它.
此外,我知道由于周期等原因引用计数可能不为零.我在这里并不关心(我在问一个单独的问题).
Python不支持向列表添加元组:
>>> [1,2,3] + (4,5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
Run Code Online (Sandbox Code Playgroud)
在语言中提供这种支持有哪些缺点?请注意,我希望这是对称的:[1, 2] + (3, 4)并且(1, 2) + [3, 4]都会评估到一个全新的列表[1, 2, 3, 4].我的理由是,一旦有人将operator +应用于元组和列表的混合,他们很可能会再次(很可能在同一个表达式中),所以我们不妨提供列表以避免额外的转换.
这是我对这个问题的动机.
经常发生的事情是我有一些小集合,我更喜欢将它们存储为元组以避免意外修改并帮助提高性能.然后我需要将这些元组与列表组合在一起,并且必须将它们中的每一个转换为列表才能生成非常难看的代码.
请注意,+=或者extend可以在简单的情况下工作.但总的来说,当我有表达时
columns = default_columns + columns_from_user + calculated_columns
Run Code Online (Sandbox Code Playgroud)
我不知道哪些是元组,哪些是列表.所以我要么必须将所有内容转换为列表:
columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)
Run Code Online (Sandbox Code Playgroud)
或者使用itertools:
columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))
Run Code Online (Sandbox Code Playgroud)
这两种解决方案都比简单的总和更为丑陋; 并且chain也可能更慢(因为它必须一次遍历输入一个元素).
我正在使用argparse(Python 3.2).参数mode定义简单如下:
p.add_argument('--mode', dest='mode')
Run Code Online (Sandbox Code Playgroud)
我想从命令行调用程序,使参数mode设置为空字符串; 或至少到一个空格' '(我可以在以后删除空格).
我试图用(在Windows)program_name --mode ""和program_name --mode " ",但既不工作.
我在Python装饰器方面遇到了一些困难,我认为这与我将一个类作为参数传递给函数装饰器的事实有关,当被装饰的函数是传递类的方法时.
我没有比这更清楚的解释问题,所以希望一些代码可以帮助:
from typeChecking import *
class Vector:
@accepts(Vector, float, float, float) #Vector hasn't been defined yet... In c++ I could forward declare...
def __init__(self, x, y, z):
self._x = float(x)
self._y = float(y)
self._z = float(z)
...
Run Code Online (Sandbox Code Playgroud)
我不认为这个定义@accepts很重要,但我会留在这里以防万一:
def accepts(*types):
def check_accepts(f):
assert len(types) == f.func_code.co_argcount
def new_f(*args, **kwds):
for (a, t) in zip(args, types):
assert isinstance(a, t), \
"arg %r does not match %s" % (a,t)
return f(*args, **kwds)
new_f.func_name = f.func_name
return new_f
return check_accepts …Run Code Online (Sandbox Code Playgroud) 为了打印熊猫DataFrame或Series完整版,我们可以使用pd.set_option('display.max_rows', None). 但这似乎不适用于Index数据类型:
import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None) # just in case
d = {i: ['a'] for i in range(1000)}
df = pd.DataFrame(d)
print(df.columns)
Run Code Online (Sandbox Code Playgroud)
将打印
Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
...
990, 991, 992, 993, 994, 995, 996, 997, 998, 999],
dtype='int64', length=1000)
Run Code Online (Sandbox Code Playgroud)
有没有办法完整打印索引?
一般来说,有没有办法告诉熊猫永远不要缩写任何输出?
(python 3.5,pandas 0.17.1,但没关系。)
我正在尝试在当前项目中实现类型注释,并且从mypy接收到了我不理解的错误。
我正在使用Python 2.7.11,并将新安装的mypy安装在基本virtualenv中。以下程序运行正常:
from __future__ import print_function
from types import StringTypes
from typing import List, Union, Callable
def f(value): # type: (StringTypes) -> StringTypes
return value
if __name__ == '__main__':
print("{}".format(f('some text')))
print("{}".format(f(u'some unicode text')))
Run Code Online (Sandbox Code Playgroud)
但是运行会mypy --py2 -s mypy_issue.py返回以下内容:
mypy_issue.py: note: In function "f":
mypy_issue.py:8: error: Invalid type "types.StringTypes"
Run Code Online (Sandbox Code Playgroud)
上面的类型似乎在Typeshed中 ... mypy 文档说:“ Mypy包含了typeshed项目,该项目包含Python内置文件和标准库的库存根。” ...不确定“ incorporates”是什么意思-我需要吗做一些事情来“激活”或提供Typeshed的路径?我是否需要在本地下载并安装(?)Typeshed?
python ×10
internals ×2
performance ×2
python-3.x ×2
argparse ×1
command-line ×1
comparison ×1
destructor ×1
intel ×1
methods ×1
mypy ×1
pandas ×1
python-3.2 ×1
sqlite ×1
typechecking ×1