小编Sha*_*ank的帖子

为什么我的'xmap'功能不比内置'map'快?

假设有一个A类,并且有一个被调用的A类实例列表lst.

假设我们想要m在列表中的每个实例上一次又一次地调用A类数百万次的特定方法(实际示例:entity.update()游戏循环中的方法).我们知道这样做的简单方法如下:

for obj in lst: obj.m()
Run Code Online (Sandbox Code Playgroud)

然而,那种代码让我们入睡.所以我们考虑map以下列方式使用:

map(lambda obj: obj.m(), lst)
Run Code Online (Sandbox Code Playgroud)

但是我们对上面的代码行进行了一些时间测试,结果发现它比我们的简单for循环慢得多.有时它甚至慢2倍.然后我们对自己说,"嗯也许它的速度慢,因为map构造了所有函数调用的返回值列表并返回该列表".

假设我们从懒惰和内存有效的内置函数中获取灵感xrange.在大多数情况下,我们认为,它是一个更酷的版本range.因此,我们定义一个名为的函数xmap,它只是在一个对象列表上应用一个函数,而不构造一个返回值列表并返回它.实施如下:

def xmap(func, lst):
    for obj in lst: func(obj)
Run Code Online (Sandbox Code Playgroud)

非常酷,因为这个函数只执行for上面的循环,只有它允许我们保持花哨并发送我们的lambda函数.我们认为这是完美的妥协.但是我们一丝不苟和谨慎,所以我们决定制作2个脚本来测试代码的速度,看看我们是否真的比它更快map.

我们的第一个脚本将简单地使用map并且无用地构建我们甚至不需要的列表.

script1.py :

class A:
    def m(self):
        pass

lst = [A() for i in xrange(15)]

import time
start = time.time()

for i in xrange(1000000):
    map(lambda obj: obj.m(), lst)

print time.time()-start, 'seconds' …
Run Code Online (Sandbox Code Playgroud)

python performance python-2.7

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

使用常量存储器旋转m个位置左侧的n个元素的一维数组?

给定n个元素的一维数组,以及如何有效地旋转数组,使数组的元素向左移动m个位置?是否可以仅使用常数O(1)内存以O(n)时间复杂度执行此操作?

例如,如果n = 8并且你的数组是,[0, 1, 2, 3, 4, 5, 6, 7]并且你将它向左旋转m = 2,那么你就得到了[2, 3, 4, 5, 6, 7, 0, 1].

这是我实现的Python中的天真解决方案,它使用O(n)时间和O(n)内存和临时数组.

def rotateLeft(A, m):
    temp = [None]*len(A)
    for i in xrange(len(temp)):
        temp[i] = A[(i + m) % len(A)]
    for i in xrange(len(A)):
        A[i] = temp[i]
Run Code Online (Sandbox Code Playgroud)

我怎么能更有效地做到这一点?我被告知这可以通过恒定的内存量来完成,并且仍然在O(n)时间内.

任何语言的解决方案都可以,任何建议都非常受欢迎.

编辑:我不是在寻找图书馆解决方案.此外,该数组不是链表/双端队列.没有头/尾/下一个/前一个元素的概念.

python arrays algorithm vector

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

正则表达式密码验证 - Codewars

免责声明:这是一个Codewars问题.

您需要编写将验证密码的正则表达式,以确保其符合以下条件:

  • 至少六个字符长
  • 包含一个小写字母
  • 包含一个大写字母
  • 包含一个数字

有效密码仅为字母数字字符.

到目前为止,这是我的尝试:

function validate(password) {
    return /^[A-Za-z0-9]{6,}$/.test(password);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这样做是为了确保每个字符都是字母数字,密码至少包含6个字符.它似乎在这些方面正常工作.

我被困在需要有效密码至少有一个小写字母,一个大写字母和一个数字的部分.如何使用单个正则表达式表达这些要求以及之前的要求?

我可以轻松地在JavaScript中执行此操作,但我希望仅通过正则表达式来完成此操作,因为这是问题所在的测试.

javascript regex

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

在Python中将新行分隔值从列表转换为字典

我有一个字母表分隔符\n.

mylist = ['a\n','b c d e\n', 'f g h i j\n', 'k l m\n', 'n o\n', 'p q r s\n', 't\n', 'u v w x y z\n'] 
Run Code Online (Sandbox Code Playgroud)

我想将其转换为格式字典:

mydict= {
a: {}
b: {c, d, e}
f: {g, h, i, j}
k: {l, m}
n: {o}
p: {q, r, s}
t: {}
u: {v, w, x, y, z}
}
Run Code Online (Sandbox Code Playgroud)

在Python中实现这一目标的最佳方法是什么?

先感谢您.

python dictionary list python-2.7

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