Yo diría que la solución más simple es descomprimir dos rangos en una lista usando el *operador de desempaquetado:
>>> [*range(6, 10), *range(-9, -5)]
[6, 7, 8, 9, -9, -8, -7, -6]
No solo es la respuesta más corta propuesta hasta ahora, sino que también es la más eficaz, ya que solo construye una lista única y no involucra llamadas de función más allá de las dos ranges.
Verifiqué esto probando todas las respuestas de esta pregunta usando el timeitmódulo:
Respuesta ID Método timeit result
-------------------------------------------------- ------------------------------------------------
(en cuestión) [x para x en el rango (6,10)] + [y para y en el rango (-9, -5)] 0.843 usec por ciclo
(esta respuesta) [* rango (6, 10), * rango (-9, -5)] 0.509 usec por ciclo
61348876 [y para x en el rango (6,10) para y en (x, -x)] 0.754 usec por ciclo
61349149 list (range_with_negatives (6, 10)) 0.795 usec por ciclo
61348914 list (itertools.chain (range (6, 10), range (-9, -5))) 0.709 usec por ciclo
61366995 [signo * x para signo, x en itertools.product ((- 1, 1), rango (6, 10))] 0.899 usec por ciclo
61371302 lista (rango (6, 10)) + lista (rango (-9, -5)) 0.729 usec por ciclo
61367180 list (range_with_negs (6, 10)) 1.95 usec por ciclo
(Pruebas de timeit realizadas con Python 3.6.9 en mi propia computadora (especificaciones promedio))