小编MSe*_*ert的帖子

自建扩展模块比内置c模块慢

要学习如何创建C扩展,我决定只复制一个内置.c文件(在本例中itertoolsmodule.c)并将其放在我的包中.我只能从更改的名称在模块内部itertoolsmypkg.

然后我编译它(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 performance python-c-api

9
推荐指数
1
解决办法
248
查看次数

什么时候类型(实例)不是实例.__ class__?

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__

python types python-3.x

9
推荐指数
1
解决办法
463
查看次数

为VS2017设置TSLint

我曾尝试安装此插件:Web Analyzer,但遗憾的是它无法在VS 2017中安装.它显示:

VSIXInstaller.NoApplicableSKUsException:此扩展程序无法安装在任何当前安装的产品上.

我想知道是否有办法在VS中设置tslint或者还有其他方法来检查语法?

javascript visual-studio typescript tslint

9
推荐指数
2
解决办法
3939
查看次数

在屈服时连接

从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)

python yield generator

9
推荐指数
2
解决办法
513
查看次数

将 line_profiler 与 numba jitted 函数一起使用

是否可以将 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)

python performance profiling numba line-profiler

9
推荐指数
1
解决办法
1950
查看次数

如何获取所有数组边?

我有 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 函数可以帮助解决这个问题(我还没有找到!),而不是用循环手动完成?

python arrays numpy

8
推荐指数
1
解决办法
4596
查看次数

Cython ipython魔术与编译时环境变量

%%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}

python ipython cython ipython-magic

8
推荐指数
1
解决办法
242
查看次数

在numpy的日志功能中会发生什么?有没有办法改善表现?

我有一个计算项目,大量使用日志函数(对于整数),数十亿的调用.我发现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中有什么办法可以提高日志功能的性能吗?

c# python performance matlab numpy

8
推荐指数
1
解决办法
573
查看次数

如何使嵌套for循环更加Pythonic

我必须为每个密钥创建一个被阻止用户的列表.每个用户都有多个属性,如果这些属性中的任何一个属于键,则会阻止用户.

我编写了以下嵌套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 list-comprehension nested-loops

8
推荐指数
3
解决办法
1241
查看次数

在Python 3.6中运行时根据Union类型检查变量

我正在尝试编写一个使用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 annotations typechecking python-3.6

8
推荐指数
4
解决办法
4081
查看次数