试图模仿Excel的SUMPRODUCT功能:
SUMPRODUCT(v1, v2, ..., vN) =
v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*vN[n]
Run Code Online (Sandbox Code Playgroud)
其中n是每个向量中元素的数量.
这类似于点积,但对于多个向量.我阅读了常规点积的非常详细的讨论,但我不知道如何将它干净地扩展到多个向量.作为参考,我正在复制那里提出的优化代码,我将其(通常)移植到Python 3.BTW,对于dot产品,最后一种方法仍然在P3K中获胜.
def d0(v1,v2):
"""
d0 is Nominal approach:
multiply/add in a loop
"""
out = 0
for k in range(len(v1)):
out += v1[k] * v2[k]
return out
def d1(v1,v2):
"""
d1 uses a map
"""
return sum(map(mul,v1,v2))
def d3(v1,v2):
"""
d3 uses a starmap (itertools) to apply the mul operator on an zipped (v1,v2)
"""
return sum(starmap(mul,zip(v1,v2)))
Run Code Online (Sandbox Code Playgroud) 我有一维numpy数组(array_)和一个Python列表(list_).
以下代码有效,但效率低,因为切片涉及不必要的副本(当然对于Python列表,我也相信numpy数组?):
result = sum(array_[1:])
result = sum(list_[1:])
Run Code Online (Sandbox Code Playgroud)
什么是改写它的好方法?
(使用Python 3.2,虽然我怀疑它很重要.)
我有class Data,class Rules和类Result.我使用小写来表示类的实例.
甲rules对象包含,如果施加到一个规则data对象,可以创建一个result对象.
我决定在哪里放置实际将规则应用于数据的(相当复杂和不断发展的)代码.我可以看到两个选择:
把那些代码放在一个类Result方法中,比如说parse_rules.Result构造函数将rules对象作为参数,并将其传递给self.parse_rules.
将该代码放在一个新类中ResultFactory.ResultFactory将是一个单例类,它有一个方法,比如说build_result,它接受rules一个参数并返回一个新构建的result对象.
这两种方法的优点和缺点是什么?
文档意味着它的确定为__new__(cls, ...)返回比不同类型的对象cls.它说在那种情况下__init__()不会被调用.它没有明确说明,但常识或简单的测试确认了对象的结果不会有类型cls.
为什么允许这种看似奇怪的行为?用例是什么?这显然是故意的.
timeit.timeit当我在以字符串形式传递的语句参数中有异常时,我似乎无法工作:
# after the first and third semicolon, I put 4 spaces
timeit.timeit('try:; a=1;except:; pass')
Run Code Online (Sandbox Code Playgroud)
这导致:
Traceback (most recent call last):
File "a.py", line 48, in <module>
timeit.timeit('try:; a=1;except:; pass')
File "C:\CPython33\lib\timeit.py", line 230, in timeit
return Timer(stmt, setup, timer).timeit(number)
File "C:\CPython33\lib\timeit.py", line 136, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 6
try:; a=1;except:; pass
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我用Python 3.3运行它,但即使使用旧的Python(3.2)也会出现同样的错误.
更新:
我正在关注这个文档(强调我的):
class timeit.Timer(stmt ='pass',setup ='pass',timer =)
用于小代码片段的定时执行速度的类.
构造函数接受一个定时语句,一个用于设置的附加语句和一个定时器函数.两个语句都默认为'pass'; 计时器功能与平台有关(请参阅模块文档字符串).stmt和setup也可能包含多个以;分隔的语句; 或换行符,只要它们不包含多行字符串文字.
我有一个字符串,我需要分成2个字母的部分.例如,'ABCDXY'应该成为['AB', 'CD', 'XY'].在奇数个字符的情况下的行为可以完全是任意的(我将提前检查长度).
没有丑陋的循环有没有办法做到这一点?
decorator模块的功能与functools.wraps密切相关.两者之间有什么区别(从Python 3.3/3.4开始)?
我正在学习Git,如果我有一个代表Git repo的数学结构的描述,那将会很棒.例如:它是一个有向无环图; 它的节点代表提交; 它的节点有标签(每个节点最多一个标签,没有标签使用两次)代表分支等(我知道这个描述不正确,我只是想解释我在寻找什么.)
如果我编译一个正则表达式
>>> type(re.compile(""))
<class '_sre.SRE_Pattern'>
Run Code Online (Sandbox Code Playgroud)
并希望将该正则表达式传递给函数并使用Mypy来键入check
def my_func(compiled_regex: _sre.SRE_Pattern):
Run Code Online (Sandbox Code Playgroud)
我遇到了这个问题
>>> import _sre
>>> from _sre import SRE_Pattern
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'SRE_Pattern'
Run Code Online (Sandbox Code Playgroud)
您似乎可以导入_sre但由于某种原因SRE_Pattern不可导入.
在Windows 10 Build 14393下使用Docker 1.13.0(9795)时,我试图运行最新的python图像(这将是3.6)时"设备上没有剩余空间":
> docker run -it python
Unable to find image 'python:latest' locally
latest: Pulling from library/python
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
52f3db4b5710: Extracting [==================================================>] 129.8 MB/129.8 MB
45b2a7e03e44: Download complete
75ef15b2048b: Download complete
e41da2f0bac3: Download complete
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: failed to register layer: Error processing tar file(exit status
1): write /usr/share/doc/libfreetype6/reference/ft2-type1_tables.html: no space left on device.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
Run Code Online (Sandbox Code Playgroud)
硬盘驱动器上有超过20 GB的可用空间,因此我认为问题出在Docker的虚拟机中.如何访问它以调查磁盘使用情况并在需要时进行清理?
docker images并docker ps -a没有发现任何大的东西:
> docker images …Run Code Online (Sandbox Code Playgroud)