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