小编use*_*924的帖子

功能速度提升:将int转换为32位整数列表

我正在寻找我的功能的快速替代品.目标是根据任意长度整数制作32位整数列表.长度在(value,bitlength)元组中明确给出.这是异步接口的bit-banging过程的一部分,每个总线事务需要4个32位整数.

所有整数都是无符号,正数或零,长度可以在0到2000之间变化

我的输入是这些元组的列表,输出应该是具有隐式32位长度的整数,其中的位按顺序排列.还应返回不适合32的其余位.

input: [(0,128),(1,12),(0,32)]
output:[0, 0, 0, 0, 0x100000], 0, 12
Run Code Online (Sandbox Code Playgroud)

我花了一两天的时间用cProfile进行分析,并尝试了不同的方法,但我似乎有点坚持使用一秒钟内需要~100k元组的函数,这有点慢.理想情况下,我想要10倍的加速,但我没有足够的经验知道从哪里开始.速度的最终目标是速度超过每秒4M元组.

感谢您的任何帮助或建议.

我能做的最快的是:

def foo(tuples):
    '''make a list of tuples of (int, length) into a list of 32 bit integers [1,2,3]'''
    length = 0
    remlen = 0
    remint = 0
    i32list = []
    for a, b in tuples:
        n = (remint << (32-remlen)) | a #n = (a << (remlen)) | remint
        length += b
        if length > 32:
            len32 = int(length/32)
            for i in range(len32): …
Run Code Online (Sandbox Code Playgroud)

python

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

Clojure中将函数映射到多个coll或sequence上的好方法

我目前正在学习Clojure,并且正在尝试学习如何以最佳方式做事。今天,我正在研究按顺序执行事务的基本概念,我了解映射,过滤和归约的基础知识。现在,我想尝试对序列中的成对元素执行操作,并且发现了执行该操作的两种方法。我应用的功能是println。输出仅为12 34 56 7

(def xs [1 2 3 4 5 6 7])
(defn work_on_pairs [xs]
  (loop [data xs]
    (if (empty? data)
      data
      (do
        (println (str (first data) (second data)))
       (recur (drop 2 data))))))
(work_on_pairs xs)
Run Code Online (Sandbox Code Playgroud)

我的意思是我可以这样

(map println (zipmap (take-nth 2 xs) (take-nth 2 (drop 1 xs))))
;; prints [1 2] [3 4] [5 6], and we loose the last element because zip.
Run Code Online (Sandbox Code Playgroud)

但这并不是真的很好。我的背景是Python,在这里我只能说zip(xs[::2], xs[1::2])但我猜这不是Clojure的方法。因此,我正在寻找有关如何以最佳Clojure方式执行此操作的建议。

我意识到我对Clojure还是很陌生,我什至不知道这种操作叫什么。

感谢您的输入

clojure

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

标签 统计

clojure ×1

python ×1