小编ric*_*izy的帖子

Cython和C++:通过引用传递

我是Cython和C++的菜鸟,所以我对论证传递有一个问题.我想避免在以下场景中传递参数的副本:

# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector

def add_one(vector[int] vect):
    cdef int i
    n = vect.size()
    for i in range(n):
        vect[i] += 1

cdef vector[int] v
for i in range(100000):
    v.push_back(i)
add_one(v) # <-- ??
Run Code Online (Sandbox Code Playgroud)

我希望该方法add_one只是修改v"就地".我相信在C++中,你可以通过预先挂起参数来实现这一点&,这意味着对指针的任何更改都会传递给指针.这样,您不必担心传递指针或实际对象,即

add_one(v); # in c++
Run Code Online (Sandbox Code Playgroud)

我可以在Cython中做同样的事情,还是我必须明确地将arg类型更改为引用,即def add_one(vector[int]* vect)

c++ python reference pass-by-reference cython

18
推荐指数
1
解决办法
7758
查看次数

C数组与NumPy数组

在性能方面(代数运算,查找,缓存等),C数组(可以作为C数组公开,或者cython.view.array[Cython数组],或上述两者的内存视图)和NumPy数组(在Cython中应该没有Python开销)

编辑:

我应该提一下,在NumPy数组中使用Cython进行静态类型化,dtypes是NumPy编译时数据类型(例如cdef np.int_t或者cdef np.float32_t),C语言中的类型是C等价物(cdef int_tcdef float)

EDIT2:

以下是Cython Memoryview文档中的示例,以进一步说明我的问题:

from cython.view cimport array as cvarray
import numpy as np

# Memoryview on a NumPy array
narr = np.arange(27, dtype=np.dtype("i")).reshape((3, 3, 3))
cdef int [:, :, :] narr_view = narr

# Memoryview on a C array
cdef int carr[3][3][3]
cdef int [:, :, :] carr_view = carr

# Memoryview on a Cython …
Run Code Online (Sandbox Code Playgroud)

c python arrays numpy cython

12
推荐指数
1
解决办法
5471
查看次数

如何找到Kubernetes集群的集群和服务CIDR?

一旦Kubernetes集群已经运行,您如何找到它的集群/服务CIDR?

我知道Minikube,它是10.0.0.1/24.

对于GKE,你可以找到通过

gcloud container clusters describe XXXXXXX --zone=XXXXXX |
  grep -e clusterIpv4Cidr -e servicesIpv4Cidr
Run Code Online (Sandbox Code Playgroud)

但是,你如何找到一个通用的Kubernetes集群,特别是通过kubectl

kubernetes kubectl

10
推荐指数
4
解决办法
7893
查看次数

处理多标签分类中的类不平衡

我在多类设置中看到了关于类不平衡的几个问题.但是,我有一个多标签问题,所以在这种情况下你会怎么处理?

我有一组约300k文本示例.如标题中所述,每个示例至少有一个标签,并且只有100个可能的唯一标签.我已经通过利用命名空间将这个问题简化为Vowpal Wabbit的二进制分类,例如

从:

healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...  
Run Code Online (Sandbox Code Playgroud)

至:

1 |healthy bananas oranges jack fruit
1 |fruit bananas oranges jack fruit
0 |evil bananas oranges jack fruit
0 |monkey bananas oranges jack fruit
0 |healthy bipedal organism family guy
0 |fruit bipedal organism family guy
1 |evil bipedal organism family guy
1 |monkey bipedal organism family guy
...  
Run Code Online (Sandbox Code Playgroud)

我正在使用大众提供的默认选项(我认为是在线SGD,具有平方损失功能).我正在使用平方损失,因为它非常类似汉明损失.

在训练之后,当在相同的训练集上进行测试时,我注意到所有的例子都是用'0'标签预测的 ......这是一种最小化损失的方法,我想.在这一点上,我不知道该怎么做.我正在考虑使用成本敏感的一对一分类来尝试平衡类,但是由于存在2 ^ 100个标签组合,因此将多标签减少到多类是不可行的.我想知道是否有其他人有任何建议.

编辑:我终于有机会测试类失衡,特别是vw …

classification machine-learning vowpalwabbit text-classification

7
推荐指数
2
解决办法
5386
查看次数

写入NumPy memmap仍然会加载到RAM内存中

我正在通过IPython Notebook测试NumPy的memmap,代码如下

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
Run Code Online (Sandbox Code Playgroud)

如你所见,它Ymap的形状非常大.我试图Ymap像稀疏矩阵一样填满.我没有使用scipy.sparse矩阵,因为我最终需要用另一个密集矩阵对它进行点积,这绝对不适合内存.

无论如何,我正在执行一系列很长的索引操作:

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
with open("somefile.txt", 'rb') as somefile:
    for i in xrange(5e6):
        # Read a line
        line = somefile.readline()
        # For each token in the line, lookup its j value
        # Assign the value 1.0 to Ymap[i,j]
        for token in line.split():
            j = some_dictionary[token]
            Ymap[i,j] = 1.0
Run Code Online (Sandbox Code Playgroud)

这些操作不知何故很快耗尽了我的RAM.我认为mem-mapping基本上是一个核心内容numpy.ndarray.我错了吗?为什么我的记忆力如此疯狂?

python numpy python-2.7

7
推荐指数
2
解决办法
5260
查看次数

Vowpal Wabbit是否会在多个在线通行证中随机播放数据?

Vowpal Wabbit会在每个纪元/通过后自动调整其数据吗?我希望创建的缓存文件将包含在线算法(如VW的默认在线SGD方法)所必需的混洗元数据.例如

vw -d train.txt -c --passes 50 -f train.model
Run Code Online (Sandbox Code Playgroud)

如果没有,我有一个备份脚本,可以在每次传递时手动调整数据

# Create the initial regressor file
vw -d train.txt -f train.model
# For the next 49 passes, shuffle and then update the regressor file
for i in {0..49}
do
    <some script: train.txt --> shuffled_data.txt>
    vw -d shuffled_data.txt -i train.model -f train.model
done
Run Code Online (Sandbox Code Playgroud)

如果VW没有自动洗牌,那么是否有更有效的方法来执行上述代码块?不幸的是,VW的wiki对此并不清楚.谢谢.

machine-learning vowpalwabbit

6
推荐指数
1
解决办法
988
查看次数

CPU上的变量,GPU上的训练/渐变

在CIFAR-10教程中,我注意到变量放在CPU内存中,但是它表示cifar10-train.py它是用单个GPU训练的.

我很困惑..存储在GPU中的图层/激活是什么?或者,是否存储在GPU中的渐变?否则,似乎在CPU上存储变量根本不会使用GPU - 所有内容都存储在CPU内存中,因此只有CPU用于前向/后向传播.

如果GPU用于f/b传播,那么由于数据CPU < - > GPU的延迟洗牌,这不是浪费吗?

tensorflow

6
推荐指数
1
解决办法
2860
查看次数

使用bitarray而不是int来节省dict的内存?

我试图减少python dict的内存消耗,在我的情况下,它作为word-->document_id"倒排索引".每个word都作为整数进行哈希处理,占用24个字节.

我想知道我是否可以将每个元素dict的值和每个键转换dict为一个bitarray.我注意到任何遇到的最大值int都小于2^22,所以我可以只分配一个"22号"的位数组.

如何才能做到这一点?到目前为止,我已经看过gmpy2bitarray库,以及std::bitsetC++ stdlib,我可以使用Cython.我从这篇文章中读到的bitarray并不是那么快gmpy.在gmpy,我不知道如何设置大小.最后,我想知道Python中的内存开销gmpybitarray对象是否值得,当我可以使用时std::bitset,它可能使用最少的内存.

c++ python cython bitarray bitset

5
推荐指数
1
解决办法
520
查看次数

什么是__attribute __((unused))static?

libuv文件heap-inl.h中,我看到以下宏

#if defined(__GNUC__)
# define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration
...
HEAP_EXPORT(void heap_init(struct heap* heap));
...
Run Code Online (Sandbox Code Playgroud)

heap-inl.h包含在loop.c使用声明函数的源文件中heap_init

根据我的解释...

  • heap-inl.h 代表堆“ inline”?
  • HEAP_EXPORT正在导出要由其他源文件使用的功能。

我不明白的是为什么标记了导出功能__attribute((unused))__。另外,为什么还要static声明?我认为static函数只能在其定义的文件中使用。此外,内联函数与这一切有什么关系?

c gcc gnu libuv

3
推荐指数
2
解决办法
606
查看次数

为什么我的dict查找不比我在Python中的列表查找更快?

我正在将文件的每一行读入列表和字典,

with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
    titles_lst = f_titles.read().split('\n')
assert titles_lst[-1] == ''
titles_lst.pop() # remove the last element, an empty string

titles_dict = {}
with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
    for i,line in enumerate(f_titles):
        titles_dict[i] = line
Run Code Online (Sandbox Code Playgroud)

我正在通过以随机顺序访问list/dict中的每个项目来测试性能:

n = len(titles_lst)
a = np.random.permutation(n)

%%time
for i in xrange(10):
    t = []
    for b in a:
        t.append(titles_lst[b])
    del t

>>> CPU times: user 18.2 s, sys: 60 ms, total: 18.2 s
>>> Wall time: 18.1 s

%%time
for i in …
Run Code Online (Sandbox Code Playgroud)

python dictionary list python-2.7 python-internals

0
推荐指数
2
解决办法
1556
查看次数

返回一个对象vs通过引用返回一个对象

两者之间有什么区别吗?

vector<int> function(vector<int>& input) {
    // do something with input then return it
    input.push_back(3);
    return input;
}
Run Code Online (Sandbox Code Playgroud)

vector<int>& function(vector<int>& input) {
    // do something with input then return it
    input.push_back(3);
    return input;
}
Run Code Online (Sandbox Code Playgroud)

有关系吗?因为当您将函数的返回值分配给新变量时,矢量会被复制:

vector<int>result = function(some_vector);
Run Code Online (Sandbox Code Playgroud)

c++

-1
推荐指数
1
解决办法
79
查看次数