小编Rom*_*man的帖子

Cython中的extra_compile_args

我想Cython通过使用将一些额外的选项传递给编译器extra_compile_args.

我的setup.py:

from distutils.core import setup

from Cython.Build import cythonize

setup(
  name = 'Test app',
  ext_modules = cythonize("test.pyx", language="c++", extra_compile_args=["-O3"]),
)
Run Code Online (Sandbox Code Playgroud)

但是,当我跑步时python setup.py build_ext --inplace,我收到以下警告:

UserWarning: got unknown compilation option, please remove: extra_compile_args
Run Code Online (Sandbox Code Playgroud)

问题:如何extra_compile_args正确使用?

我用Cython 0.23.4下了Ubuntu 14.04.3.

cython

16
推荐指数
3
解决办法
7673
查看次数

在Java BigInteger中使用科学格式的字符串初始化?

我需要使用大数字(在1E100 - 1E200范围内).但是,BigInteger该类似乎通常是合适的,在初始化期间不识别科学格式的字符串,也不支持转换为格式的字符串.

BigDecimal d = new BigDecimal("1E10"); //works
BigInteger i1 = new BigInteger("10000000000"); //works
BigInteger i2 = new BigInteger("1E10"); //throws NumberFormatException
System.out.println(d.toEngineeringString()); //works
System.out.println(i1.toEngineeringString()); //method is undefined
Run Code Online (Sandbox Code Playgroud)

有办法吗?我无法想象这样的类的设计是假设用户必须输入数百个零.

java biginteger

11
推荐指数
1
解决办法
798
查看次数

从ggplot2中x的列名称构建所有数据框列的箱形图

我有一个my.df以下结构的数据框:

   A B  C
1  1 1  2
2  2 3  4
3  3 5  6
4 NA 7  8
5 NA 9 NA
Run Code Online (Sandbox Code Playgroud)

如何使用x轴上的列名和y上的所有值构建一个箱形图?

有很多答案,如:

ggplot(melt(my.df), aes(variable, value)) + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

但我不明白,我实际应该传递的是"变量"和"价值".我尝试了x=colnames(my.df)),这部分有效,但我仍然不知道如何处理y.

r ggplot2

10
推荐指数
1
解决办法
2万
查看次数

使用NaN值反向排序Numpy数组

我有一个numpy带有一些NaN值的数组:

>>> a
array([  1.,  -1.,   nan,  0.,  nan], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

我可以按升序或'降序'排序:

>>> numpy.sort(a)
array([ -1.,   0.,   1.,  nan,  nan], dtype=float32)
>>> numpy.sort(a)[::-1]
array([ nan,  nan,   1.,   0.,  -1.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

但是,我想要的是降序,最后是NaN值,如下所示:

>>> numpy.genuine_reverse_sort(a)
array([ 1.,   0.,   -1.,  nan,  nan], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

怎么可以实现呢?我怀疑没有特别的方法.

python arrays numpy

8
推荐指数
2
解决办法
1278
查看次数

mpi4py中的共享内存

我使用MPImpi4py)脚本(在单个节点上),该脚本可用于非常大的对象。为了让所有进程都可以访问该对象,我通过分发了该对象comm.bcast()。这会将对象复制到所有进程,并占用大量内存,尤其是在复制过程中。因此,我想共享诸如指针之类的东西,而不是对象本身。我发现一些memoryview有用的功能有助于增强流程中对象的工作。同样,对象的实际内存地址也可以通过memoryview对象字符串表示形式进行访问,并且可以这样分配:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank:
    content_pointer = comm.bcast(root = 0)
    print(rank, content_pointer)
else:
    content = ''.join(['a' for i in range(100000000)]).encode()
    mv = memoryview(content)
    print(mv)
    comm.bcast(str(mv).split()[-1][: -1], root = 0)
Run Code Online (Sandbox Code Playgroud)

打印:

<memory at 0x7f362a405048>
1 0x7f362a405048
2 0x7f362a405048
...
Run Code Online (Sandbox Code Playgroud)

这就是为什么我认为必须有一种方法可以在另一个过程中重构对象。但是,我在文档中找不到有关如何执行此操作的线索。

简而言之,我的问题是:是否可以在中同一节点上的进程之间共享对象mpi4py

mpi shared-memory python-3.x memoryview mpi4py

6
推荐指数
2
解决办法
1928
查看次数

Numpy字符串编码

模块numpy是一个出色的工具,可以高效地存储python对象,其中包括字符串.对于numpy数组中的ANSI字符串,每个字符仅使用1个字节.

但是,有一个不便之处.存储对象的类型不多string但是bytes,这意味着在大多数情况下必须进行解码以便进一步使用,这反过来意味着相当庞大的代码:

>>> import numpy
>>> my_array = numpy.array(['apple', 'pear'], dtype = 'S5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an b'apple' and a b'pear'
>>> print("Mary has an {} and a {}".format(my_array[0].decode('utf-8'),
... my_array[1].decode('utf-8')))
Mary has an apple and a pear
Run Code Online (Sandbox Code Playgroud)

使用其他数据类型可以消除这种不便,例如:

>>> my_array = numpy.array(['apple', 'pear'], dtype = 'U5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an apple and a pear
Run Code Online (Sandbox Code Playgroud)

但是,这只能通过内存使用量增加4倍来实现:

>>> numpy.info(my_array)
class:  ndarray …
Run Code Online (Sandbox Code Playgroud)

python string numpy python-3.x

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

由正则表达式拆分,而不会在 Python 中产生空字符串

我想分割一个包含不规则重复分隔符的字符串,就像方法split()一样:

>>> ' a b   c  de  '.split()
['a', 'b', 'c', 'de']
Run Code Online (Sandbox Code Playgroud)

但是,当我通过正则表达式应用 split 时,结果是不同的(空字符串潜入结果列表):

>>> re.split('\s+', ' a b   c  de  ')
['', 'a', 'b', 'c', 'de', '']
>>> re.split('\.+', '.a.b...c..de..')
['', 'a', 'b', 'c', 'de', '']
Run Code Online (Sandbox Code Playgroud)

我想看到的:

>>>some_smart_split_method('.a.b...c..de..')
['a', 'b', 'c', 'de']
Run Code Online (Sandbox Code Playgroud)

python regex

4
推荐指数
2
解决办法
9499
查看次数

通过从C++中删除字符串中的垃圾字符来优化大小

我有两个版本的Hello World程序:

#include <iostream>
int main() {
    std::cout<<"Hello World";
}
Run Code Online (Sandbox Code Playgroud)

#include <iostream>
int main() {
    std::cout<<"Hello World and a very long message";
}
Run Code Online (Sandbox Code Playgroud)

如果执行严格的大小优化,我期望这些二进制文件的大小不同.但是,当我用g++ -Os -o test test.cpp -Wl,--strip-all(with GCC 5.4.0)编译时,我得到相同的文件大小(在我的系统上是6336,这是Ubuntu).这意味着有一些垃圾空间用于一些最小尺寸的缓冲区(尽管在这个例子中我希望字符串是const char[]).

我的问题:这个缓冲区的本质是什么以及如何从生成的二进制文件中删除垃圾字符?

c++ optimization

4
推荐指数
1
解决办法
111
查看次数

Java中的同步失败

教程我读到:

对同一对象的两个同步方法的调用不可能进行交错.当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法(暂停执行)直到第一个线程完成对象.

但是,在我的简单示例中,仍然存在用于访问message对象的竞赛.

public class TestThread extends Thread{
    int thread;
    StringBuilder message;

    public TestThread(int thread, StringBuilder message) {
        this.thread=thread;
        this.message=message;
        start();
    }

    public void run() {
        synchronized(this){
            for (int i=0; i<1000000; i++) {
                double a=2*2;
            }
            modifyMessage();
        }
    }

    public synchronized void modifyMessage() {
        message.append(thread);
    }
}

public class TestMultithreading {
    static TestThread[] testThreads = new TestThread[5];

    public static void main(String args[]) {
        StringBuilder message = new StringBuilder("A");
        for (int i=0;i<5;i++)
            testThreads[i] = new TestThread(i, message); …
Run Code Online (Sandbox Code Playgroud)

java multithreading

3
推荐指数
1
解决办法
766
查看次数

Cython中的并行性不起作用

我有以下Cython代码:

from cython import parallel
from libc.stdio cimport printf

def test_func():
    cdef int thread_id = -1
    with nogil, parallel.parallel(num_threads=10):
        thread_id = parallel.threadid()
        printf("Thread ID: %d\n", thread_id)
Run Code Online (Sandbox Code Playgroud)

但是,它始终只启动一个线程,即始终只输出

Thread ID: 0
Run Code Online (Sandbox Code Playgroud)

我在做多线程时做错了什么?

python openmp cython

3
推荐指数
1
解决办法
895
查看次数