要学习如何创建C扩展,我决定只复制一个内置.c文件(在本例中itertoolsmodule.c)并将其放在我的包中.我只能从更改的名称在模块内部itertools来mypkg.
然后我编译它(Windows 10,MSVC Community 14)setuptools.Extension:
from setuptools import setup, Extension
itertools_module = Extension('mypkg.itertoolscopy',
sources=['src/itertoolsmodulecopy.c'])
setup(...
ext_modules=[itertools_module])
Run Code Online (Sandbox Code Playgroud)
默认使用编译器标志/c /nologo /Ox /W3 /GL /DNDEBUG /MD,我在某处读取这些默认值等于python编译方式的设置.但是我使用conda(64位设置),所以这可能不一定是真的.
这一切都进展顺利 - 但是一个基准测试filterfalse显示它几乎比内置的慢2倍:
import mypkg
import itertools
import random
a = [random.random() for _ in range(500000)]
func = None
%timeit list(filter(func, a))
100 loops, best of 3: 3.42 ms per loop
%timeit list(itertools.filterfalse(func, a))
100 loops, best of 3: 3.41 ms …Run Code Online (Sandbox Code Playgroud) Python具有内置函数type,每个实例也有一个__class__属性.我一般认为他们回归了同样的事情.甚至两个声音的文档都相似:
instance.__class__类实例所属的类.
和
type(object)使用一个参数,返回对象的类型.
但是,abc.ABCMeta.__instancecheck__检查它们是否相同(略微缩短):
subclass = instance.__class__
subtype = type(instance)
if subtype is subclass:
Run Code Online (Sandbox Code Playgroud)
什么时候不是这样的?什么时候type(instance)不一样instance.__class__?
我曾尝试安装此插件:Web Analyzer,但遗憾的是它无法在VS 2017中安装.它显示:
VSIXInstaller.NoApplicableSKUsException:此扩展程序无法安装在任何当前安装的产品上.
我想知道是否有办法在VS中设置tslint或者还有其他方法来检查语法?
从python函数中产生时如何连接两个项?
基本情况:
import itertools
def test():
for number in range(0,10):
yield number
list(test()) # [0...9]
Run Code Online (Sandbox Code Playgroud)
如果我想同时得到number它的正方形怎么办?number**2
import itertools
def test():
for number in range(0,10):
yield itertools.chain.from_iterable([
number,number*2
])
list(test())
# [0,0,1,1,2,4,3,9,...] pretended
# <itertools.chain at 0x135decfd0> ... what I got
Run Code Online (Sandbox Code Playgroud)
但是,itertools.chain.from_iterable([generator1, generator2])从外部做,给出了预期的结果.
def first_list():
for number in range(0,5):
yield number
def second_list():
for number in range(5,10):
yield number
list(itertools.chain.from_iterable([first_list(), second_list()]))
Run Code Online (Sandbox Code Playgroud) 是否可以将 line_profiler 与 Numba 一起使用?
调用%lprun装饰的函数会@numba.jit返回一个空的配置文件:
Timer unit: 1e-06 s
Total time: 0 s
File: <ipython-input-29-486f0a3cdf73>
Function: conv at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 @numba.jit
2 def conv(f, w):
3 f_full = np.zeros(np.int(f.size + (2 * w.size) - 2), dtype=np.float64)
4 for i in range(0, f_full.size):
5 if i >= w.size - 1 and i < w.size + f.size - 1:
6 f_full[i] = f[i - w.size …Run Code Online (Sandbox Code Playgroud) 我有 anxn 数组,想接收它的轮廓值。例如,
[4,5,6,7]
[2 ,2,6, 3]
[4 ,4,9, 4]
[8,1,6,1]
从这个,我会得到这个
[4,5,6,7,3,4,1,6,1,8,4,2]
Run Code Online (Sandbox Code Playgroud)
(看哪里加粗)
因此,从本质上讲,获取围绕二维数组边缘的所有值的一维数组的最有效方法是什么?我问是因为我假设有一个 numPy 函数可以帮助解决这个问题(我还没有找到!),而不是用循环手动完成?
该%%cython命令非常方便创建cython函数而无需构建和使用包.该命令有几个选项,但我找不到在那里指定编译时环境变量的方法.
我想要相当于:
from Cython.Distutils.extension import Extension
ext = Extension(...
cython_compile_time_env={'MYVAR': 10},
...)
Run Code Online (Sandbox Code Playgroud)
为%%cython命令.
我已经尝试过:
%%cython -cython_compile_time_env={'MYVAR':10}
IF MYVAR:
def func():
return 1
ELSE:
def func():
return 2
Run Code Online (Sandbox Code Playgroud)
但是这引发了一个异常:
Error compiling Cython file:
------------------------------------------------------------
...
IF MYVAR:
^
------------------------------------------------------------
...\.ipython\cython\_cython_magic_28df41ea67fec254f0be4fc74f7a6a54.pyx:2:8: Compile-time name 'MYVAR' not defined
Run Code Online (Sandbox Code Playgroud)
和
%%cython --cython_compile_time_env={'MYVAR':10}
IF MYVAR:
def func():
return 1
ELSE:
def func():
return 2
Run Code Online (Sandbox Code Playgroud)
投
UsageError:无法识别的参数: - cython_compile_time_env = {'MYVAR':10}
我有一个计算项目,大量使用日志函数(对于整数),数十亿的调用.我发现numpy的日志性能出乎意料地慢了.
以下代码需要15到17秒才能完成:
import numpy as np
import time
t1 = time.time()
for i in range(1,10000000):
np.log(i)
t2 = time.time()
print(t2 - t1)
Run Code Online (Sandbox Code Playgroud)
但是,math.log函数从3到4秒的时间要少得多.
import math
import time
t1 = time.time()
for i in range(1,10000000):
math.log(i)
t2 = time.time()
print(t2 - t1)
Run Code Online (Sandbox Code Playgroud)
我还测试了matlab和C#,它们分别需要大约2秒和0.3秒.
MATLAB
tic
for i = 1:10000000
log(i);
end
toc
Run Code Online (Sandbox Code Playgroud)
C#
var t = DateTime.Now;
for (int i = 1; i < 10000000; ++i)
Math.Log(i);
Console.WriteLine((DateTime.Now - t).TotalSeconds);
Run Code Online (Sandbox Code Playgroud)
在python中有什么办法可以提高日志功能的性能吗?
我必须为每个密钥创建一个被阻止用户的列表.每个用户都有多个属性,如果这些属性中的任何一个属于键,则会阻止用户.
我编写了以下嵌套for-loop,它适用于我,但我想以更加pythonic的方式编写它,使用更少的行和更具可读性的方式.我怎样才能做到这一点?
for key in keys:
key.blocked_users = []
for user in get_users():
for attribute in user.attributes:
for key in keys:
if attribute.name == key.name:
key.blocked_users.append(user)
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个使用Python 3.6类型提示的函数装饰器,以检查参数字典是否尊重类型提示,并且如果未出现带有问题清晰说明的错误,则将其用于HTTP API。
问题是,当函数具有使用Union类型的参数时,我无法在运行时根据其检查变量。
例如我有这个功能
from typing import Union
def bark(myname: str, descr: Union[int, str], mynum: int = 3) -> str:
return descr + myname * mynum
Run Code Online (Sandbox Code Playgroud)
我可以:
isinstance('Arnold', bark.__annotations__['myname'])
Run Code Online (Sandbox Code Playgroud)
但不是:
isinstance(3, bark.__annotations__['descr'])
Run Code Online (Sandbox Code Playgroud)
因为Union不能与isinstance或一起使用issubclass。
我找不到使用类型对象检查它的方法。我尝试自己执行检查,但是在REPL中bark.__annotations__['descr']显示typing.Union[int, str]时,如果不使用检查的丑陋技巧,我将无法在运行时访问类型列表bark.__annotations__['descr'].__repr__()。
是否有访问此信息的正确方法?还是故意在运行时不易于访问它?
python ×9
performance ×3
numpy ×2
annotations ×1
arrays ×1
c# ×1
cython ×1
generator ×1
ipython ×1
javascript ×1
matlab ×1
nested-loops ×1
numba ×1
profiling ×1
python-3.6 ×1
python-3.x ×1
python-c-api ×1
tslint ×1
typechecking ×1
types ×1
typescript ×1
yield ×1