There was one more error. (smiles ;) Fixed below def all_equal_array_list(alist) -> bool:
if alist[1:] == alist[:-1]: return True return False def all_equal(alist) -> bool: if len(alist) == 0 or all(i == alist[0] for i in alist[1:]): return True return False all_equal(tlst) times = [1.3971288939937949e-05] seconds. all_equal_array_list(tlst) times = [2.3801841149106623e-06] seconds. Karen. On Tue, Jan 8, 2019 at 9:01 PM Karen Shaeffer <klsshaef...@gmail.com> wrote: > There were some issues with my test. After sending the email, I thought > > those times couldn't be real. Here are better results: > > > all_equal(tlst) times = [6.719925760501064e-05] seconds. > > > all_equal_array_list(tlst) times = [4.2184268278069794e-06] seconds. > > > import timeit > > > def all_equal(alist) -> bool: > > if len(alist) == 0 or all(i == alist[0] for i in alist[1:]): > > return True > > return False > > > def all_equal_array_list(alist) -> bool: > > if alist == alist[:-1]: > > return True > > return False > > > tlst = [42 for _j in range(5000)] > > > def timeit_all_equal() -> bool: > > return all_equal(tlst) > > > def timeit_all_equal_array_list() -> bool: > > return all_equal_array_list(tlst) > > > if __name__ == '__main__': > > tae = > timeit.repeat(timeit_all_equal,repeat=2,number=1000000,globals=globals()) > > print(f"all_equal(tlst) times = {[_t/1e6 for _t in tae]} seconds.\n") > > > taeal = > timeit.repeat(timeit_all_equal_array_list,repeat=2,number=1000000,globals=globals()) > > print(f"all_equal_array_list(tlst) times = {[_t/1e6 for _t in taeal]} > seconds.\n") > > On Tue, Jan 8, 2019 at 3:11 PM Karen Shaeffer <klsshaef...@gmail.com> > wrote: > >> On 08Jan2019 15:28, Dan Sommers <2qdxy4rzwzuui...@potatochowder.com> >> wrote: >> >> >> >>> a = [1, 1, 1, 1, 1] >> >> >> >>> a[1:] == a[:-1] >> >> >> True >> >> >> >>> a == a[::-1] >> >> >> True >> >> >> >> >> >> >>> a = [1, 2, 3, 4, 3, 2, 1] >> >> >> >>> a[1:] == a[:-1] >> >> >> False >> >> >> >>> a == a[::-1] >> >> >> True >> >> >> >> >> >> Looks like Peter's pretty clever after all. :-) >> >> > >> >> > Except that his solution always scans then entire list. Twice. >> >> > >> >> > For large dissimilar lists this gets needlessly expensive in a linear >> fashion >> >> > with the length of the list. >> >> > >> >> > It is succinct, but wasteful. >> >> > >> >> I ran it with the timeit module for the specific case of a list: >> >> >> tlst = [True for _j in range(int(1e8))] >> >> >> # Very fast. >> >> # all_equal(tlst) times = [9.820610110182315e-07, 9.798338289838284e-07, >> 9.83037088997662e-07, >> >> # 9.824190249200911e-07] seconds. >> >> def all_equal(alist) -> bool: >> >> if len(alist) == 0 or all(i == a[0] for i in a[1:]): >> >> return True >> >> return False >> >> >> # The variant: if alist == alist[::-1]: >> >> # actually has a memory leak. And I eventually killed the process after >> waiting about >> >> # ten minutes, while watching the memory leak. >> >> # >> >> # This variant doesn't have a memory leak. I'm still waiting after 15 >> minutes. Might give up >> >> # on it. The other solution is the way to go. >> >> def all_equal_array_list(alist) -> bool: >> >> if alist == alist[:-1]: >> >> return True >> >> return False >> >> >> if __name__ == '__main__': >> >> tae = >> timeit.repeat(timeit_all_equal,repeat=4,number=1000000,globals=globals()) >> >> print(f"all_equal(tlst) times = {[_t/1e6 for _t in tae]} seconds.\n") >> >> >> taeal = >> timeit.repeat(timeit_all_equal_array_list,repeat=4,number=1000000,globals=globals()) >> >> print(f"all_equal_array_list(tlst) times = {[_t/1e6 for _t in taeal]} >> seconds.\n") >> > -- https://mail.python.org/mailman/listinfo/python-list