小编Jay*_*Jay的帖子

了解Python 3.8中的shared_memory

我正在尝试了解的某些shared_memory操作。

查看源代码,看起来该模块shm_open()用于UNIX环境,并且Windows上的CreateFileMapping\ OpenFileMapping与结合使用mmap

我从这里了解到,为了避免通过进行彻底的序列化/反序列化pickle,必须为他的共享数据类型实现__setstate__()__getstate__()明确实现。

我在中看不到任何此类实现shared_memory.py

如何shared_memory避开泡菜处理?

而且,在Windows机器上,仅此一项似乎在所有解释器中都可以幸免:

from mmap import mmap

shared_size = 12
shared_label = "my_mem"

mmap(-1, shared_size , shared_label)
Run Code Online (Sandbox Code Playgroud)

为什么在这里需要CreateFileMapping\ OpenFileMapping

python mmap pickle shared-memory python-multiprocessing

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

与Python中的套接字工作分开计算

我正在序列化列数据,然后通过套接字连接发送它.就像是:

import array, struct, socket

## Socket setup
s = socket.create_connection((ip, addr))

## Data container setup
ordered_col_list = ('col1', 'col2')
columns = dict.fromkeys(ordered_col_list)

for i in range(num_of_chunks):
    ## Binarize data
    columns['col1'] = array.array('i', range(10000))
    columns['col2'] = array.array('f', [float(num) for num in range(10000)])
    .
    .
    .

    ## Send away
    chunk = b''.join(columns[col_name] for col_name in ordered_col_list]
    s.sendall(chunk)
    s.recv(1000)      #get confirmation
Run Code Online (Sandbox Code Playgroud)

我希望将计算与发送分开,将它们放在单独的线程或进程上,这样我就可以在数据被发送时继续进行计算.

我把二值化部分作为生成器函数,然后将生成器发送到一个单独的线程,然后通过队列产生二进制块.

我从主线程中收集了数据并将其发送出去.就像是:

import array, struct, socket
from time import sleep
try:
    import  thread
    from Queue import Queue
except:
    import _thread …
Run Code Online (Sandbox Code Playgroud)

python sockets concurrency multithreading

7
推荐指数
1
解决办法
279
查看次数

使用multiprocessing.pool.map通过同一套接字发送

我正在尝试通过套接字连接打包和发送列数据。

为了加快速度,我考虑过将包装(struct.pack)分成多个过程。

为了避免两种方式的腌制,我认为最好由打包过程自己发送数据,因为据说可以从Python 3.4开始腌制套接字对象。

这是我正在工作的简化版本:

import socket
from multiprocessing import Pool
from struct import pack

# Start and connect a socket
s = socket.socket()
s.connect((ip, port))

# Data to be packed and sent in this order
data1 = 1, 2, 3, 4
data2 = 5, 6, 7, 8
data3 = 9, 10, 11, 12

# Top level column packer/sender for mp.pool
def send_column(column):
    return s.send(pack(f'{len(column)}i', *column))


pool = Pool()

# Will this necessarily send the data in order? …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-multiprocessing

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

我可以在不使用循环的情况下将字符串列表添加到 Tkinter 列表框吗?

我试图了解将一堆以某种方式预先排列的字符串添加到 Listbox 小部件的最快方法是什么,以便每个字符串都在一个新行中。

到目前为止我能收集到的最快的:

 from Tkinter import *

 strings= 'str1', 'str2', 'str3'
 listbox=Listbox(None)
 [listbox.insert(END, item) for item in strings]
 listbox.pack()
Run Code Online (Sandbox Code Playgroud)

是否有一种更干净、更快的方法来完成它,而无需遍历每个字符串?也许如果字符串以某种方式或使用其他方法预先打包?

如果相关,我想用它来显示目录列表。

python optimization listbox tkinter

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

多处理.RawArray 操作

我读到RawArray可以在进程之间共享而无需复制,并且想了解它在 Python 中是如何实现的。

我在sharedctypes.py中看到, a是从heap.pyRawArray中的a 构造的,然后用 取消。BufferWrapperctypes.memset

BufferWrapper由一个对象组成Arena,该对象本身是由一个mmap(或 Windows 中的 100 个 mmap,请参见heap.py中的第 40 行)构建的

我读到mmap系统调用实际上是在Linux/BSD中用于分配内存的,而Python模块在windows中使用MapViewOfFile 。

mmap那么看起来很方便。它似乎可以直接与mp.pool-

from struct import pack
from mmap import mmap

def pack_into_mmap(idx_nums_tup):

    idx, ints_to_pack = idx_nums_tup
    pack_into(str(len(ints_to_pack)) + 'i', shared_mmap, idx*4*total//2 , *ints_to_pack)


if __name__ == '__main__':

    total = 5 * 10**7
    shared_mmap = mmap(-1, total * 4)
    ints_to_pack = range(total)

    pool = …
Run Code Online (Sandbox Code Playgroud)

ctypes mmap multiprocessing python-3.x

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

如何使用 ctypes 中的 IFileOperation

我想使用IFileOperation从 python 代码复制文件 -

  • 它很快(比 python 还快)
  • 你会得到一个很好的对话框
  • 不阻止Python

在 Windows 10 上,Python 3.8 -

import ctypes

ctypes.windll.shell32.IFileOperation
Run Code Online (Sandbox Code Playgroud)

似乎不存在。

我怎样才能使用IFileOperation(不是已弃用的SHFileOperationAPI)ctypes

python winapi ctypes windows-shell python-3.x

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

解释与Python中的动态调度惩罚

我看了Brandon Rhodes关于Cython的演讲 - "EXE的日子在我们身上".

布兰登在09:30提到,对于一段特定的短代码,跳过解释给出了40%的加速,而跳过分配和发送则给出了574%的加速(10:10).

我的问题是 - 如何测量特定的代码?是否需要手动提取底层c命令,然后以某种方式使运行时运行它们?

这是一个非常有趣的观察,但我如何重新创建实验呢?

python dynamic-programming performance-testing cython dispatch

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

python 中的 os.read(0,) 与 sys.stdin.buffer.read()

我遇到了picotui库,很想知道它是如何工作的。

我在这里(第 147 行)看到它使用:

os.read(0,32)
Run Code Online (Sandbox Code Playgroud)

谷歌说 0 代表标准输入,但从标准输入读取的公认答案是通过

sys.stdin.buffer.read()
Run Code Online (Sandbox Code Playgroud)

我想知道两者之间有什么区别。哪个更快?哪个版本更便携?

python stdin

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

hdfs.connect()vs PyArrow中的HdfsClient

如果这是一个菜鸟问题,我道歉,但我找不到任何相关的参考 -

这两者有什么区别?

如果我想使用pyarrow从hdfs读取镶木地板文件,我会使用哪一个?

hadoop hdfs parquet pyarrow

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

使用PyArrow从HDFS读取实木复合地板文件

我知道我可以使用pyarrow连接到HDFS群集 pyarrow.hdfs.connect()

我也知道我可以利用读取拼花文件pyarrow.parquetread_table()

但是,read_table()接受一个文件路径,而hdfs.connect()给我一个HadoopFileSystem实例。

是否可以仅使用pyarrow(安装了libhdfs3)来获取驻留在HDFS集群中的拼花文件/文件夹?我希望获得的是to_pydict()函数,然后可以传递数据。

hdfs parquet pyarrow

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

使用Pyarrows的HdfsClient进行多处理

我有一个顶级函数,它获取一个包含镶木地板文件路径和列名称的元组.

该函数只加载文件中的列,转换为pandas,而不是将其打包/序列化为标准格式.就像是:

import pyarrow as pa
import pyarrow.parquet as pq
from multiprocessing import Pool

def binarizer(file_data_tuple):
   ''' Read a Parquet column a file, binarize and return'''

   path, col_name, col_meta, native = file_data_tuple
   if not native: 
       # Either this or using a top level hdfs_con
       hdfs_con = pa.hdfs.connect(params)     
   read_pq = pq.read_table if native else hdfs_con.read_parquet

   arrow_col = read_pq(filepath, columns = (col_name,))
   bin_col = imported_binarizng_function(arrow_col)
   return bin_col

def read_binarize_parallel(filepaths):
    ''' Setup parallel reading and binarizing of a parquet file'''

    # list of …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing parquet pyarrow

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

pip 如何告诉 Python 如何导入 C 扩展

sysv_ipc我希望以便携的方式使用该库。

我安装了它:

pip3 install sysv_ipc

然后从Python:

import sysv_ipc
sysv_ipc.__file__

# Output:
# /home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

如果我将该文件复制到文件夹(pip uninstall库),然后从该文件夹打开 python 并尝试相同的导入,则会失败。

我尝试检查还安装了哪些内容,结果发现:

/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info
/home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/INSTALLER
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/LICENSE
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/METADATA
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/RECORD
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/REQUESTED
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/WHEEL
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/top_level.txt
Run Code Online (Sandbox Code Playgroud)

我也没有在setup.py中找到线索。

我想弄清楚的是——

sysv_ipcpip 如何/在哪里与要从该特定文件导入的Python 相关?

pip python-c-api python-import python-3.x python-internals

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

如何在 Node.js 10 中从缓冲区读取/写入 bigint?

我看到节点 10 支持 BigInt。但是,Buffer 类中没有 ReadBigInt() 功能。

有可能以某种方式绕过它吗?也许读取 2 个整数,将它们转换为 BigInt,移动上面的一个并将它们相加以重建 bigint?

buffer bigint node.js

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