【问题标题】:Suggestions for optimization PythonPython优化建议
【发布时间】:2022-07-26 22:13:30
【问题描述】:

这是 Python 中一个相当直接的编程问题,我正在寻找进一步优化的建议。除了非常大的字符串外,我正在及时成功处理。我不是在寻找代码,而是我应该研究优化改进的领域。我已经确定我可以跳过偶数减少循环操作,并且考虑到操作的性质,模式最终会重复,这就是为什么我会在重复发生时进行跟踪。如果 n > 重复,这允许我突破。如果将字符串转换为列表是最有效的,我不肯定。

问题:

我们有一个字符串 s 和一个数字 n,表示函数运行的次数。这是一个获取字符串的函数,将偶数索引字符连接到前面,将奇数索引字符连接到后面。您执行此操作 n 次。

例子:

s = "qwertyuio" 且 n = 2 的示例: 经过 1 次迭代 s = "qetuowryi" 经过 2 次迭代 s = "qtorieuwy" 返回“qtorieuwy”

def jumbled_string(s, n):

sl = list(s)
repeat = 0
for y in range(0,n):
    for i in range(1, (len(sl)//2)+1):
        sl.append(sl.pop(i))
    if repeat == 0 and ''.join(sl) == s:
        repeat = y+1
        break
if repeat != 0:
    afterrepeat = n%repeat
    for y in range(0,afterrepeat):
        for i in range(1, (len(sl)//2)+1):
            sl.append(sl.pop(i))

return ''.join(sl)

【问题讨论】:

  • 号码n有什么作用?
  • 输入和预期输出的一个或多个示例也会有所帮助。
  • @trincot:我正要问同样的问题。 n 在问题中做了什么?
  • 看来n 只是重复了操作。所以s = 'abcdefghijklmn'; for _ in range(3): s = s[::2] + s[1::2] 给出的结果与 OP 的函数相同(即jumbled_string(s, 3) => 'aidlgbjemhckfn')。
  • 我投票结束这个问题,因为关于改进工作代码的问题更适合Code Review,但请记得先查看他们的on-topic 页面

标签: python optimization


【解决方案1】:

我不知道您所说的“模式重复”是什么意思。但是,如果我们坚持问题陈述,那就是 Python 中的一条线:

s='abecidofug'
from itertools import chain
s2 = ''.join(chain([s[c] for c in range(1, len(s), 2)],[s[c] for c in range(0, len(s), 2)]))
s2
'bcdfgaeiou'

【讨论】:

  • 这做错了,应该是前面的偶数索引
  • 我没有包含 n 表示执行奇偶操作的次数。根据字符串长度,经过 X 次迭代,字符串将返回其原始形式。所以即使 n 是 1000000,如果字符串只有 10 个字符,找到它何时重复,只需找到 mod n/repeat 值以减少我必须循环的次数。
【解决方案2】:

你没有解释 n 做了什么。声明是这样的:

def jumbled_string(s: str) -> str:
    even = s[::2]
    odd=s[1::2]
    return "".join(even)+"".join(odd)

print(jumbled_string("0123456789"))
>>>0246813579

【讨论】:

  • 我的错,你重复这个函数n次。