1
dswill 2019 年 3 月 6 日
使用 numpy.where()函数试下效果。 注:我也是初学者,不过刚好看到这个,感觉可能用得上。
|
2
stebest 2019 年 3 月 6 日
我有个问题,为啥不直接 c=random.shuffle([i for i in range(5000)]), d=random.shuffle([i for i in range(5000,10000)])
如果是乱序的话,排个序不是更好分了。 |
3
jmc891205 2019 年 3 月 6 日 via iPhone
你说的两种方法都可以 都是线性的时间复杂度
没必要纠结 append 或两次比较什么的 |
4
airborne007 2019 年 3 月 6 日
@stebest random.shuffle 返回的是 None
|
5
airborne007 2019 年 3 月 6 日
一次循环和先排序再切片,效率都差不多,append 本身也不慢,都是线性复杂度,没必要太纠结。
|
7
stebest 2019 年 3 月 6 日
@airborne007 没把 c=写到括号里,2333。不过 O(n)时间内,已经是比较好的结果了。
|
9
CosimoZi 2019 年 3 月 6 日
你想什么呢,组成新列表这个动作只要有,就是 O(n)的复杂度.
|
10
myyou 2019 年 3 月 6 日
如果数组存的都是存储的都是相同类型可以考虑使用 array 的 append 方法: https://docs.python.org/3.6/library/array.html
|
15
hahastudio 2019 年 3 月 6 日
那你可以试试 itertools.groupby
|
16
jmc891205 2019 年 3 月 6 日 via iPhone
@zblc4c4 在工程上 你就是在做无用功。
不过我再给你提供一个线性时间复杂度的思路吧 你可以参考快排中的 partition 部分 在原 list 上把比 b 小的都交换到 b 之前 比 b 大的都交换到 b 之后 这样既不用 append 也不会比较两次 而且不需要申请额外的内存 |
17
rabbbit 2019 年 3 月 6 日
这个跟算法没啥关系,就跑一遍就完了.算法一般不考虑是 n 还是 2n,那个 2 直接约掉了.
楼主应该是想问 append 和列表生成式哪个效率高吧. |
18
shyrock 2019 年 3 月 6 日
我认为效率最高的方法是先用 sort 排序,然后 bisect 找到切分点。
|
19
angryRabbit 2019 年 3 月 6 日
我提个思路,直接 copy、遍历、替换为 None
a=list(range(0,5000)) b=2000 c=a.copy() d=a for i,elem in enumerate(0,c): if i>b: c[i]=None else: d[i]=None |
20
zblc4c4 OP |
21
xiaoke0718 2019 年 3 月 6 日
你怎么会看得懂?我学习这么久了怎么还是看不懂.....
|
22
xpresslink 2019 年 3 月 6 日
建议楼主学习一下 numpy.array,什么都不改同样的事情就比 list 性能高百倍以上。
实在不行也要用 array.array 做这些操作,比 list 也快得多。 |
23
WXG999 2019 年 3 月 6 日
@xiaoke0718 有其他语言基础呗
|
24
cyspy 2019 年 3 月 7 日
这里的主要问题是 python 中 list 这个数据结构的 append 性能太差,算法复杂度上没什么问题
|
25
leis1015 2019 年 3 月 7 日 via iPhone
这么纠结性能你用啥 python 啊
会点别的需要写性能要求高部分,python 当胶水就好了,毕竟那么多库都这样干的… |
26
necomancer 2019 年 3 月 8 日
numpy 版:
a = np.array(a) flag = a < b c = a[flag] d = a[np.logical_not(flag)] |